【发布时间】:2016-08-04 11:04:29
【问题描述】:
我编写了以下两个代码来计算斐波那契数列的一个元素。
def fib(n):
zero, one = 0, 1
k = 1
while k < n:
zero, one = one, zero + one
k = k + 1
return one, ls
def fib2(n, memo=None):
if memo is None:
memo = {}
if n == 1 or n == 2:
return 1
if n in memo:
return memo[n]
else:
memo[n-1] = fib2(n-1, memo)
memo[n-2] = fib2(n-2, memo)
return memo[n-1] + memo[n-2]
##import timeit
##
##print('Fibonacci 1:', timeit.timeit('fib(10000)', '''def fib(n):
## zero, one = 0, 1
## k = 1
## while k < n:
## zero, one = one, zero + one
## k = k + 1
## return one''', number=100))
##
##print('Fibonacci 2:', timeit.timeit('fib2(10000)', '''import sys; sys.setrecursionlimit(10001);
##def fib2(n, memo=None):
## if memo is None:
## memo = {}
## if n == 0 or n == 1:
## return 1
## if n in memo:
## return memo[n]
## else:
## memo[n-1] = fib2(n-1, memo)
## memo[n-2] = fib2(n-2, memo)
## return memo[n-1] + memo[n-2]''', number=100))
我在fib 中使用了一个简单的while 循环,fib2 是相同的递归实现。但事实证明,fib2 异常缓慢。我想知道为什么会这样。是因为fib2 创建了很多帧吗?我是否正确实现了fib2?
谢谢。
【问题讨论】:
-
@ChatterOne 用 Java 写的。
-
没关系,区别在于递归和迭代。仔细阅读接受的答案,您会发现编程语言并不重要。
-
递归通常较慢,因为您已经知道堆栈帧。在 python 等高级语言中很难说多少,但速度较慢。你记忆
fib2的方式可能会拖慢你的程序。看看functools中的lru_cache装饰器,而不是自己做memoize(我没有花时间看你是如何memoize的,但如果你做错了,肯定会对速度)。 -
@ChatterOne 他的问题不是专门关于递归与迭代,而是更多的迭代与记忆递归。您链接到的问题一般是关于递归与迭代,但没有提到记忆。
标签: python python-3.x recursion fibonacci