当前位置:   article > 正文

自底向上与自顶向下(递归与动态规划)

自底向上

从子问题解决原问题, 无非是两种方法,自底向上(Bottom-Up)与自顶向下(Top-Down),形式上前者对应iteration,利用循环将结果存在数组里,从数组起始位置向后计算;后者对应recursion,即利用函数调用自身实现。如果不存储上一个状态的解,则为递归,否则就是DP。举个斐波那契数列(0,1,1,2,3,5…)的例子:

1) 自底向上

  1. int array[n] = {0};
  2. array[1] = 1;
  3. for (int i = 2; i < n; i++)
  4. array[i] = array[i-1] + array[i-2];

这里,为了说明方法,采用数组存储结果,空间复杂度O(n)。事实上,额外空间可以进一步缩小到O(1):利用几个变量记录之前的状态即可。由于我们记录了子问题的解,故给出的方法就是DP。事实上,自底向上的方式往往都是通过动态编程实现

2) 自顶向下

  1. int Fibonacci(int n)
  2. {
  3. if(n == 0)
  4. return 0;
  5. if(n == 1)
  6. return 1;
  7. return Fibonacci(n-1) + Fibonacci(n-2);
  8. }

为计算Fibonacci的第n个元素,我们先自顶向下地计算子问题:第n-1个元素和第n-2个元素。由于没有存储子问题的运算结果,我们给出的方法是递归

递归与动态规划的异同

什么是动态规划

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/601304
推荐阅读
相关标签
  

闽ICP备14008679号