3 回答
TA貢獻1828條經驗 獲得超13個贊
問題在于您的類型提示:它應該是n: int而不是int: n.
在普通腳本中,您會得到NameError如下所示:
def fib2(int: n):
pass
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-19-2a2734193e18> in <module>()
----> 1 def fib2(int: n):
2 pass
NameError: name 'n' is not defined
在您的情況下發生的情況是您可能已經n在之前在 IPython 中運行過的單元格中進行了定義。因此,您不會得到“NameError”,但您的參數會得到 name int,并且n函數中使用的是n您之前在某處使用過的全局變量。如果它是一個大于 2 的數字,您的遞歸調用將永遠不會結束:
n = 3 # might have been in some other cell
F = [-1] * 101
def fib2(int: n):
if n < 2:
return n
if F[n] != -1:
return F[n]
F[n] = fib2(n-1) + fib2(n-2)
return F[n]
print(fib2(100))
---------------------------------------------------------------------------
[...]
RuntimeError: maximum recursion depth exceeded in comparison
只需按正確的順序編寫類型提示,一切都很好:
F = [-1] * 101
def fib2(n: int):
if n < 2:
return n
if F[n] != -1:
return F[n]
F[n] = fib2(n-1) + fib2(n-2)
return F[n]
print(fib2(100))
# 354224848179261915075
TA貢獻1866條經驗 獲得超5個贊
類型提示不正確,這對我有用:
# fixed type hint
F:list = [-1] * 50
# fixed type hint
def fib2(n:int) -> int:
if n < 2:
return n
if F[n] != -1:
return F[n]
F[n] = fib2(n-1) + fib2(n-2)
return F[n]
fib2(49)
=> 7778742049
添加回答
舉報
