您的位置:首页 > 其它

走进递归的世界

2016-11-14 23:36 218 查看

走进递归的世界

从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚正在给小和尚讲故事。从前有座山......这里就存在方法定义中调用函数方法本身的现象。递归分两步,递和归。它会消耗很多堆栈空间和函数调用时间,因为递归可以产生无限的循环体,每一次它的返回值会占用一定得空间

一.递归需要满足的条件

             并不是所有问题都可以用递归来解决。那么什么样的问题可以用递归来解决呢?一般来讲,能用递归来解决的问题必须满足两个条件

l   可以通过递归调用缩小问题规模,并且旧问题和新问题有着相同的形式

l   存在一种可以退出的情况

 

二.          递归的原理



递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。而递归算法的一般形式为:

function func(num){

       if(endCondition){

              constExpression  //基本项

} else {

       accumrateExpreesion  //归纳项

       num = expression //步进表达式

       func(num)  //调用函数本身

}

}

递归不仅是“自己调用自己”,还可以交互调用的递归,它更多的是一种分析和解决问题的方法和思想。递归的思想是:“把问题分解成为规模更小的,具有与原问题有着相同解法的问题。”

曾看到一个大神对递归的解释是这样的:”古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知,致知在格物。物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平。“ 对于递归的优化可以用到尾递归来进行优化。

            并不是所有问题都能用递归来解决。那么什么样的问题可以用递归来解决呢?一般来讲,能用递归来解决的问题必须满足两个条件

四.递归列子

4.1斐波那契数列。兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
  function fac(n){

    if(n==1||n==2){

        return 1;

    }

    return fac(n-1)+fib(n-2); 

  }

     
4.2 阶乘。一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数,并且有0的阶乘为1。自然数n的阶乘写作n!。
      function factorial(n){

    if(n == 1){

       return 1;

    }

    return n * factorial(n- 1)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: