Проблема заключается в подсказке типа: она должна быть 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', но ваш параметр получает имя 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