Я изучаю запоминание в рекурсивных функциях и наткнулся на пример Фибоначчи на Youtube. Я никогда не видел, чтобы человек запускал код, поэтому, возможно, он написал его неправильно.
Когда я скопировал код и попытался запустить его, я сначала получил ошибку, так как я объявил memo без диапазона, поэтому я просто установил диапазон на вход + 1 (так как я не использую 0-индекс) и, таким образом, решил эту проблему. Но теперь я застрял в неправильном возвращаемом значении.
def fib(num, memo=[]):
if num == 0:
return 0
elif num == 1 or num == 2:
return 1
elif memo[num] != None:
return memo[num]
else:
memo[num] = fib(num-1, memo) + fib(num-2, memo)
return memo[num]
uInput = int(input("Fibonacci: "))
memo = list(range(uInput + 1))
fibNum = fib(uInput, memo)
print(fibNum)
Приведенный выше код не выдает ошибку, а просто возвращает значение «uInput». Поэтому, если я введу 6 для 6-го числа Фибоначчи, программа вернет 6 вместо 8, что является фактическим 6-м числом. Я не знаю, почему это происходит.
Когда я погуглил проблему, я нашел темы, которые предлагали использовать dicts вместо списков. Все в порядке, если это единственный способ сделать это. Но если есть способ заставить его работать со списком, я бы хотел понять, как это сделать, чтобы понять, почему я столкнулся с этой проблемой.