在解决欧拉计划第25题时,我使用了多种技术来计算第n个斐波那契数。其中记忆化似乎是最快的方法,并且直觉上,我预期记忆化要比从下向上创建列表更快。
两个函数的代码如下:
def fib3(n): #FASTEST YET
fibs= [0,1] #list from bottom up
for i in range(2, n+1):
fibs.append(fibs[-1]+fibs[-2])
return fibs[n]
def fib4(n, computed= {0:0, 1:1}): #memoization
if n not in computed:
computed[n]= fib4(n-1, computed)+ fib4(n-2, computed)
return computed[n]
print fib3(1000)
print fib4(1000)
fib3比fib4快约8倍。我无法弄清楚背后的原因。本质上,它们都会在计算时存储值,一个存储在列表中,另一个存储在字典中,以便稍后可以将它们作为“缓存”访问。为什么有如此大的差异呢?
fib4
是递归的(调用自身)。递归很耗费资源。 - Klaus D.