普通递归实现:
def fib(N):
if N == 0:
return 1
if N == 1:
return 1
if N > 1:
return fib(N-1) + fib(N-2)
import time
t1 = time.time()
print(fib(40))
t2 = time.time()
print(t2-t1)
#运行结果为
165580141
53.53498697280884
上方时间花费在求重复的值上,例如fib(40)=fib(39)+fib(38),fib(39)=fib(38)+fib(37)这里fib(38)就会被求两次,fib(37),fib(36)...也是。
如果在这儿加入缓存,将每次求出来的结果保存到数组,就会节省大部分时间。实现如下。
缓存机制求斐波那契:
def fib(N):
if N == 0:
return 1
if N == 1:
return 1
arr = [1 for i in range(N+1)]
for i in range(2, N+1):
arr[i] = arr[i-1] + arr[i-2]
return arr[N]
import time
t1 = time.time()
print(fib(40))
t2 = time.time()
print(t2-t1)
#运行结果:
165580141
0.00018906593322753906
由图可知,时间从53秒优化到8毫秒。