dynamic-programming - 斐波那契记忆执行顺序
问题描述
以下代码是使用记忆化的斐波那契数列。但我不明白算法中的执行顺序。如果我们做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]
解决方案
该函数dynamic_fib
(调用一次)只是将工作委托给fibonacci
,在那里完成真正的工作。在fibonacci
你有一个字典dic
,它用于在计算后保存函数的值。所以,当你第一次调用函数时,对于每个值(2-n)fibonacci
,它都会计算结果,但它也会将它存储在字典中,这样当我们下次请求它时,我们已经有了它,我们不需要再次遍历整棵树。所以复杂度是线性的,O(n)
。
推荐阅读
- c - 如何使用 sscanf 提取子字符串?
- python - num+=i>num 行后面的逻辑是什么
- firebase - 如何在 Flutter 中启用/禁用 Firebase Crashlytics
- reactjs - 如何使用 .map 函数评估 React 中对象中的每个值
- database - Structuring of data for users in firebase
- php - php将关联数值数组转换为普通数组
- git - Git不断复制文件并在文件名末尾附加'2'
- python - 如何根据物品消耗找到物品生命周期?
- mysql - 计划的 MySQL 事件未触发
- java - 如何避免使用 Instanceof 运算符?