【发布时间】:2019-04-21 03:24:10
【问题描述】:
在计算第 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_divide_recursion(25)调用函数150049次,评估fib_linear_recursion(25)调用它47次,随着n的增长,差异会迅速恶化。 -
除此之外,因为您将递归用于最常见的迭代编程示例。
-
@Klaus 是的,但递归学习斐波那契也很有价值 - 事实上,它是最常见的递归介绍程序之一。
-
@Klaus 好吧,我同意你的观点,但不幸的是,很难抵消先例的浪潮。无论如何,学习斐波那契对于理解递归与迭代的优缺点很有用,即使它并不理想,仅仅是因为它已经非常成熟了。
标签: python algorithm fibonacci