让我用个经典小例子给你捋一捋 递归——记忆化搜索——动态规划 三者之间的关系

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
  

猜你喜欢

转载自blog.csdn.net/weixin_38246633/article/details/85910760
今日推荐