python - 为什么这两种寻找第 n 个斐波那契数的算法中的一种更有效?
问题描述
在计算第 64 个斐波那契数时,第一个算法需要几个小时,而第二个算法需要不到一秒。
为什么第二种算法的效率比第一种算法高这么多?
它们看起来非常相似。
def fib_divide_recursion(n):
if n <= 2:
return n-1
else:
return fib_divide_recursion(n-1) + fib_divide_recursion(n-2)
def fib_linear_recursion(n, prev={}):
if n <= 2:
return n-1
try:
return prev[n]
except KeyError:
prev[n] = fib_linear_recursion(n - 1, prev) +
fib_linear_recursion(n - 2, prev)
return prev[n]
解决方案
第二种实现是使用“记忆”来记住以前计算的斐波那契值。
考虑到您正在尝试计算fib(5)
:您首先必须计算fib(4)
和fib(3)
。fib(4)
本身也需要你去计算fib(3)
。事实上,对于每个斐波那契数,您可以计算每个前面的斐波那契数一次并存储它们(这是记忆方法)。或者,在性能更差的情况下,您可以重新计算您需要的每个斐波那契数,即使您之前已经计算过了。显然,如果没有记忆,您将需要做更多的工作,并且对于高斐波那契数,这确实会产生影响,正如您所观察到的。
推荐阅读
- youtube-api - 搜索结果有几个“nextPageToken”,但没有更多项目
- python-3.x - python PyQT5中带有外来字符的Python正则表达式
- wpf - 停止动画而不重置到开始位置 wpf
- c++ - 从另一个 constexpr std::array 初始化没有默认构造函数的对象的 std::array
- python - 在 matplotlib 中的子图上过度绘制轮廓
- c++ - 从 QWidgetAction 访问 QCheckBox
- ios - IOS 图表 - YAxis 缩放数字四舍五入到最接近的百、千等
- azure - 如何命名 Azure 存储帐户?
- django - 如何从模型中获取查询集的 id 并使用表单将它们存储到不同的模型中?
- javascript - 如何在 Node.JS 中呈现 flash 消息?