我正在使用一个递归函数,例如:
from functools import lru_cache
init = {0:1,1:1}
@lru_cache(maxsize=10000)
def fib(n):
global init
if n in init.keys():
return init[n]
else:
return fib(n-1)+fib(n-2)
我将 init 定义为全局变量,以便保存所有中间步骤以供将来的任何计算使用,但是如果我运行:
print(fib(20))
print(init)
它打印:
10946
{0: 1, 1: 1}
为什么即使我将 init 定义为全局变量,它仍然打印相同的字典?我敢打赌这是因为返回声明,但我可能会担心。
您不会更新函数中init
的值,因此它永远不会从原始值更改。计算当前斐波那契数时需要更新它:
from functools import lru_cache
init = {0:1,1:1}
@lru_cache(maxsize=10000)
def fib(n):
global init
if n in init.keys():
return init[n]
else:
fibn = fib(n-1)+fib(n-2)
init[n] = fibn
return fibn
print(fib(20))
print(init)
输出:
10946
{0: 1, 1: 1, 2: 2, 3: 3, 4: 5, 5: 8, 6: 13, 7: 21, 8: 34, 9: 55, 10: 89, 11: 144, 12: 233, 13: 377, 14: 610, 15: 987, 16: 1597, 17: 2584, 18: 4181, 19: 6765, 20: 10946}