3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
這里有一些問題。一旦修復(fù)了無限遞歸,問題仍然存在。
您不需要每次fib調(diào)用函數(shù)時(shí)都初始化列表,而只需在第一次fibList未提供參數(shù)時(shí)初始化列表,因此默認(rèn)為None.
您的代碼無法生成序列中的前兩個(gè)數(shù)字0和1。您可以通過簡(jiǎn)單地初始化列表以包含這些術(shù)語(yǔ)并調(diào)整邏輯以僅提供 N-2 個(gè)術(shù)語(yǔ)來解決此問題。
可以改進(jìn)函數(shù)的簽名,以使調(diào)用者更容易使用它。呼叫者只關(guān)心他/她想要的術(shù)語(yǔ)數(shù)量。用戶不必知道要輸入什么初始值x和y值。
這是代碼的一個(gè)版本,修復(fù)了無限遞歸、修復(fù)了缺失的術(shù)語(yǔ),并且還重新排列了簽名,以便用戶可以簡(jiǎn)單明了地調(diào)用該函數(shù):
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))
結(jié)果:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

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

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