码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-09-14 13:16:00      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:int   code   结束   状态转移方程   简单   条件   进入   状态   算法   

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];
      }



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

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

标签:int   code   结束   状态转移方程   简单   条件   进入   状态   算法   

原文地址:https://www.cnblogs.com/liveformyself/p/11518864.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!