我是 python 新手,我在構建遞回函式時遇到問題,該函式檢查給定數字是否為斐波那契數。
這是我的代碼。
def isFib(n):
if n <= 1:
return n
else:
return (n - 1) (n - 2)
if isFib(n) == 1 or isFib(n) == isFib(n - 1) isFib(n - 2):
return True
在這兩種情況下它都應該列印 True,但是它列印 True 和 False,我找不到問題所在
print(all([isFib(i) for i in [1,2,3,5,8,13,21,34,55]]))
print(all([not isFib(2*i) for i in [1,2,3,5,8,13,21,34,55]]))
uj5u.com熱心網友回復:
函式的第一部分是if陳述句。如果True,它回傳一個值 - 如果False,它也回傳一個值。因此,您的函式的第二部分無法執行,并且該函式不是遞回的(因為您不會在任何一條return陳述句中再次呼叫該函式)。
更一般地說,你正在做的事情永遠不會奏效。邏輯似乎是:“一個斐波那契數是前一個斐波那契數和之前那個數的總和,所以我可以通過計算來反轉這個邏輯n - 1,n - 2如果它們是斐波那契數,那么也是n”——或者類似的東西。
但這不起作用:5 是斐波那契數,但 (5-1) 不是,所以邏輯就在那里中斷。如果您認為總和需要是斐波那契數:13 是斐波那契數,但是 (13-1) (13-2) = 23 也不是斐波那契數。
解決這個問題的一個簡單方法是只生成一個斐波那契數列并True在您檢查的數字出現時立即回傳:
def is_fib(n, seq=None):
if seq is None:
seq = [0, 1]
# n is Fibonacci if the last number in the sequence is
# or if the last number has not yet past n, then compute the next and try again
return n == seq[-1] or (seq[-1] < n and is_fib(n, seq [seq[-2] seq[-1]]))
print([is_fib(i) for i in [1,2,3,5,8,13,21,34,55]])
print(is_fib(23))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/537106.html
下一篇:C 中的硬幣找零問題卡在遞回上
