3 回答

TA貢獻1836條經驗 獲得超3個贊
這里有一些問題。一旦修復了無限遞歸,問題仍然存在。
您不需要每次fib調用函數時都初始化列表,而只需在第一次fibList未提供參數時初始化列表,因此默認為None.
您的代碼無法生成序列中的前兩個數字0和1。您可以通過簡單地初始化列表以包含這些術語并調整邏輯以僅提供 N-2 個術語來解決此問題。
可以改進函數的簽名,以使調用者更容易使用它。呼叫者只關心他/她想要的術語數量。用戶不必知道要輸入什么初始值x和y值。
這是代碼的一個版本,修復了無限遞歸、修復了缺失的術語,并且還重新排列了簽名,以便用戶可以簡單明了地調用該函數:
def fib(l, x=0, y=1, fibList=None):
? ? if fibList is None:
? ? ? ? fibList = [0, 1]
? ? z = x + y
? ? x = y
? ? fibList.append(z)
? ? y = z
? ? if len(fibList) < l-1:
? ? ? ? return fib(l, x, y, fibList)
? ? else:
? ? ? ? return(fibList)
print(fib(10))
結果:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

TA貢獻1765條經驗 獲得超5個贊
在你設置的第二行fibList = []
。這意味著每次遞歸調用該函數時,它都會將列表重置為空,因此len(fibList)
始終等于 1。
刪除該行,以便 fibList 變量不會重置,然后它應該正確滿足您的退出條件?,F在是這樣寫的,它會永遠運行,直到損壞為止。

TA貢獻1833條經驗 獲得超4個贊
fib在每個函數調用開始時,您可以使用 清除您的fibList值fibList = []。因此列表的長度將始終為<= 1,因此您會遇到無限遞歸循環,這不好。你需要添加類似的東西if fibList is None:
當您首次調用函數“fib”而未在參數列表中提供任何第四條語句時,fibList 的值最初將設置為“None”。但稍后,當您再次遞歸調用函數“fib”時,您將在參數列表中提供一個 fibList。所以該值不再是“無”。因此,當添加如上所述的 if 語句時,該函數知道您何時從外部調用該函數(當您在代碼中將其調用為“fib(1,2,10)”時),或者何時該函數遞歸地調用自身。因此,您不必每次調用該函數時都重置 fibList,而是在開始時僅設置 1 次。
def fib(x, y, l, fibList=None):
if fibList is None:
fibList = []
z = x + y
...
- 3 回答
- 0 關注
- 178 瀏覽
添加回答
舉報