亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

編寫遞歸函數來求解斐波那契數列

編寫遞歸函數來求解斐波那契數列

PHP
www說 2023-11-09 10:56:24
我想用 Python 編寫斐波那契遞歸函數。x是起點,y是后續點x,l是長度。我不明白我的思維錯誤是什么: def fib(x, y, l, fibList=None):    fibList = []    z = x + y    x = y    fibList.append(z)    y = z    if len(fibList) <= l:        return fib(x, y, l, fibList)    else:        return(fibList)結果是:RecursionError: maximum recursion depth exceeded while calling a Python object我可以用 for 循環來解決它,但不能用遞歸函數來解決。
查看完整描述

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]


查看完整回答
反對 回復 2023-11-09
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

在你設置的第二行fibList = []。這意味著每次遞歸調用該函數時,它都會將列表重置為空,因此len(fibList)始終等于 1。

刪除該行,以便 fibList 變量不會重置,然后它應該正確滿足您的退出條件?,F在是這樣寫的,它會永遠運行,直到損壞為止。


查看完整回答
反對 回復 2023-11-09
?
瀟瀟雨雨

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

    ...


查看完整回答
反對 回復 2023-11-09
  • 3 回答
  • 0 關注
  • 178 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號