0 1 2 3 5
其实下面三个方法都是自下而上,只不过用递归的话,如果用二叉树画出递归的结构图就会发现,出现了很多重复运算,比如说fib(100)=fib(99)+fib(98)。
记忆化搜索通过新增一个列表容器来记录已经计算过的内容,这样就避免了重复运算,提高了效率,但是很明显有空间换时间的味道。
动态规划通过两个变量保存目标之前两个的内容就可以了,这样省略了空间开销,也提高了效率。
但是必须声明,这里的动态规划相对比较简单,真正的动态规划是有表结构可以推算的。
1.递归
def fab(n):
if n==0:
return 0
if n==1:
return 1
return fab(n-1)+fab(n-2)
2.记忆化搜索
def fab(n):
memo = [-1]*(n+1)
def fib(n):
if n==0:
memo[0] = 0
if n==1:
memo[1] = 1
if memo[n]==-1:
memo[n] = fab(n-1)+fab(n-2)
return memo[n]
return fib(n)
3.动态规划
def fab(n):
if n<=1:
return 0
a ,b =0, 1
for i in range(1,n):
res = a+b
b,a = res,b
print(res)
return res