普通递归
import time
def fibo(n):
if n == 0:
return 0
if n == 1:
return 1
return fibo(n-1) + fibo(n-2)
n = 35
start_time = time.time()
a = fibo(n)
end_time = time.time()
print("fibo(%d) = %d" % (n, a))
print("runing time = ", end_time-start_time)
普通递归由于进行了大量重复计算,n=35在我的计算机上需要5秒多,n每增加1运行时间为指数级增长。
记忆化搜索
import time
def fibo(n):
if n == 0:
return 0
if n == 1:
return 1
if memory[n] == -1:
memory[n] = fibo(n-1) + fibo(n-2)
return memory[n]
n = 35
memory = [-1] * (n+1)
start_time = time.time()
a = fibo(n)
end_time = time.time()
print("fibo(%d) = %d" % (n, a))
print("runing time = ", end_time-start_time)
记忆化搜索,建立一个列表存储计算过的数值,递归的时候不需要重复计算,运行时间大大减少。由于python递归存在最大递归深度,当n数值较大时,例如n=10000,会抛出异常:RecursionError: maximum recursion depth exceeded in comparison
.
动态规划
import time
def fibo(n):
memory = [0, 1]
for i in range(2, n+1):
memory.append(memory[i-1] + memory[i-2])
return memory[n]
n = 10000
start_time = time.time()
a = fibo(n)
end_time = time.time()
print("fibo(%d) = %d" % (n, a))
print("runing time = ", end_time-start_time)