以下代码是使用memoization的斐波那契序列。但我不明白算法中的执行顺序。如果我们执行dynamic_fib(4),它将计算dynamic_fib(3)+ dynamic_fib(2)。然后左侧调用,然后计算dynamic_fib(2)+ dynamic_fib(1)。但是在计算dynamic_fib(3)时,当我们没有将结果保存到字典的内存地址(例如C中的& dic [n]时)时,dynamic_fib(2)的缓存答案如何传播以重新使用。
我认为应该发生的是,dynamic_fib(2)的答案已经消失,因为它只存在于该堆栈中。因此,在计算dynamic_fib(4)
时,必须再次计算dynamic_fib(2)我错过了什么吗?
def dynamic_fib(n):
return fibonacci(n, {})
def fibonacci(n, dic):
if n == 0 or n == 1:
return n
if not dic.get(n, False):
dic[n] = fibonacci(n-1, dic) + fibonacci(n-2, dic)
return dic[n]
答案 0 :(得分:0)
函数dynamic_fib
(一次调用)只是将工作委托给fibonacci
,完成了真正的工作。在fibonacci
中,您有字典dic
,用于在计算函数后保存函数的值。因此,对于第一次调用函数fibonacci
时的每个值(2-n),它会计算结果,但它也会将其存储在字典中,以便下次我们要求时它,我们已经拥有它,我们不需要再次穿越整棵树。所以复杂性是线性的,O(n)
。