斐波那契记忆执行顺序

时间:2018-05-30 08:14:09

标签: dynamic-programming fibonacci memoization

以下代码是使用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]

1 个答案:

答案 0 :(得分:0)

函数dynamic_fib(一次调用)只是将工作委托给fibonacci,完成了真正的工作。在fibonacci中,您有字典dic,用于在计算函数后保存函数的值。因此,对于第一次调用函数fibonacci时的每个值(2-n),它会计算结果,但它也会将其存储在字典中,以便下次我们要求时它,我们已经拥有它,我们不需要再次穿越整棵树。所以复杂性是线性的,O(n)