关于递归和动态规划的简单理解

Posted liveformyself

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于递归和动态规划的简单理解相关的知识,希望对你有一定的参考价值。

1.递归的定义

简单的来说,递归就是一个概念能够用自身来解释,比如说一本字典,每个字词的解释是依靠字典中其他的字词来解释的。一般来说,计算机中遇到的递归问题大多是把一个问题分解成规模更小的子问题求解,再进行合并。

递归的性质

一个具有递归性质的问题,大多具有两个特征,第一个是状态转移方程也就是递归方程,比如在求解阶乘时,n!=n*(n-1)!,就将求解n的阶乘转换为求解n-1的阶乘。第二个特征就是终止条件,一个递归是一类问题的求解,必定有一个结果

无法一只递归下去,有一个结束条件,也就是当问题规模简化的足够小的时候可以直接的出答案。在求解阶乘时,当问题过为1的时候就直接输出1.

    int f(n)
    
       if(n==1)//终止条件
         
            return 1;
           
          else
           
              return n*f(n-1);//递归方程
             
     

递归的代价

递归执行时,递归函数会被反复地调用,一层一层的进入,到达终止条件后,再一层一层出来,为了保证结果的正确性,每一层函数的运算结果和状态都必须保存在系统所分配的栈里面,当数据量很大的时候,递归所占用的空间和运行时间会非常恐怖,效率也很低

这里再介绍一种和递归类似的但执行效率更高的动态规划算法。

动态规划的性质

递归算法是从顶置低求解问题,而·动态规划算法是从低置顶求解问题,同样也需要状态转移方程方程,和初始条件,相较于递归算法的优势,动态规划算法不需要反复调用自身函数,也不需要储存每一层函数的状态,故而时间花费和空间花费都要少的多。

阶乘的动态规划算法

    int f(n)
     
         int array[n+1],i;//array[i]表示i的阶乘
          array[1]=1;
           for(i=2;i<=n;i++)
                
                  array[n]=n*array[n-1];//状态转移方程
                
            return array[n];
      



此算法,无论是时间,还是在空间上都优于递归算法。但是针对某些问题,递归算法代码量更少,更好理解,比如汉诺塔,若用动态规划算法求解,时间消耗虽远远小于递归算法,但实现难度却也大于递归算法。
个人观点,欢迎大家讨论,斧正

以上是关于关于递归和动态规划的简单理解的主要内容,如果未能解决你的问题,请参考以下文章

递归?这次真不行 —— “动态规划” 入门理解(下)

DP 动态规划初识

一文彻底理解动态规划套路

递归和动态规划算法的复盘

通过动画轻松理解递归与动态规划

看动画轻松理解“递归”与“动态规划”