以下代碼計算第 n 個斐波納契數:
def fib(n, a=0, b=1):
return fib(n-1, b, a b) if n > 0 else a
我正在努力理解如何提出這樣的解決方案。看起來這個公式來自一個空白。然而,一定有一些步驟導致了這樣一個公式。不幸的是,這樣的腳手架已被移除,并給出了一個干凈的公式。
PS:我知道 Python 沒有 TCO。
如果有圖或者影片就完美了。
uj5u.com熱心網友回復:
所以。我能想到的最好的解釋。通常,斐波那契數列以 0, 1 開頭,以給出序列
0, 1, 1, 2, 3, 5, 8, 13, 21, ...
但是您可以擁有以任何數字對開頭的序列。例如
2, 5, 7, 12, 19, 31, 50, ....
現在有一個有趣的事實。看順序
1, 1, 2, 3, 5, 8, 13, 21, ...
它是這些替代序列之一,但它以 1, 1 開頭。它恰好是缺少第一個的斐波那契數列的元素。和
1, 2, 3, 5, 8, 13, 21, 34, ...
是這些替代序列中的另一個,但它也是缺少前兩個元素的斐波那契數列。
所以fib(n, a, b)只是“給我‘替代’斐波那契數列的第 n 個元素,它的前兩個元素是a和b。
uj5u.com熱心網友回復:
n 是 fib 值的反向索引
a 是 fib(n) 從 0 開始
b 是 fib(n 1)
uj5u.com熱心網友回復:
隨著每次遞回呼叫 n 減少,b作為 new 傳遞,a而 newb是 old a b。注意它是如何準確表示斐波那契邏輯的:
n 0 1 1 2 3 5 8
5 a b
4 a b
3 a b
2 a b
1 a b
0 a b # -> fib(5) == 5 (== a)
uj5u.com熱心網友回復:
跟蹤呼叫,在這種情況下 n=5:
def fib(n, a=0, b=1):
return fib(n-1, b, a b) if n > 0 else a
call fib(5)
call fib(4, 1, 1)
call fib(3, 1, 2)
call fib(2, 2, 3)
call fib(1, 3, 5)
call fib(0, 5, 8)
return 5
return 5
return 5
return 5
return 5
return 5
uj5u.com熱心網友回復:
這基本上是迭代版本,但以遞回形式撰寫:
def fibi(n,a=0,b=1):
while n>0:
a,b = b, a b
n = n-1
return a
在這兩種情況下,n 不再是一個計數器,它告訴我們應該執行多少次a,b = b, a b步驟,如果我們初始化一個計數器i=0并計數直到到達n或喜歡這里我們減少n它在這種情況下告訴我們如何我們已經離開了許多步驟
uj5u.com熱心網友回復:
代碼似乎只是重寫簡單回圈的一種奇特方式。
請注意,n在遞回代碼中根本不與a或互動b。它只是作為一個計數器。每次減1,當變為0時,遞回結束。所以它實際上只是一個for帶有n迭代的回圈。然后每次都切換方式a和b,這是計算斐波納契的相當標準的方式。
因此,以下或多或少是等效的代碼重寫:
def fib(n):
a = 0
b = 1
for _ in range(n):
a, b = b, a b
return a
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344908.html
上一篇:如何列印所有結果?
下一篇:int物件不可迭代添加兩個串列
