怎么理解递归

来源:互联网 发布:如何恢复电脑网络设置 编辑:程序博客网 时间:2024/06/02 18:14

递归最经典的例子就是:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”

递归需要几个条件:

1,递归必须 要有边界条件,也就是递归出口(退出递归)

2,递归前进段和递归返回段,也就是最后得到的值

3,当边界条件(递归出口)不满足时,递归前进;当边界条件(递归出口)满足时,递归返回。

举个递归小例子,比如,

张三去和李四借钱,李四说你等一下,我去找王五借给你,

然后李四去找王五借钱,王五说你等一下,我去找赵六借给你,

最后王五找赵六借钱,赵六借给了王五。(这里就是递归出口)

这里有一个规律就是最先执行的最后返回,比如张三去借钱,最后才会把钱给他。

傻瓜式理解递归,就是忘记递归,假设它的子问题已经解决,从上面的例子说就是假设李四已经有钱。

下面说一个场景,斐波纳契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144

已知前两项的和,求第三项的和,因为重复用到这个方法,所以用到递归去解:

斐波那契数列的规律是当前项等于前两项的和,得到的公式是f(n)=f(n-1)+f(n-2);这里的n表示第几项,上递归代码:

这里假设子问题已经解决,加入求第10项的值公式为:f(10)=f(9)+f(8)故而出现上面的公式

function f($n){    if($n==1 || $n==2){        return 1; // 递归出口,    }    return f($n-1)+f($n-2); // 假设子问题已经解function f($n){    $a = 1;    $b = 1;     $v = 1;<br>    for($i=3;$i<=$n;++$i){        $v = $a+$b;        $b = $a;        $a = $v;    }    return $v;}

吃了一半,又多吃一个!当到第十天时,只有一个桃子了。问题,有几个桃子?

第十天,只有一个桃子,第九天就是(1+1)*2个桃子,假设子问题已经解决,f(1)=(f(2)+1)*2,第一天的桃子等于第二天桃子加1乘以2,上代码:

/** * 递归实现方法 */function f($n=1){    if($n==10){        return 1; // 递归出口    }    return (f($n+1)+1)*2;}
/** * 用迭代的方法 */function f($n){    $v = 1; // 设定初始值    for($i=9;$i>=$n;--$i){        $v = ($v+1)*2;    }    return $v;}echo f(1);
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 幼儿教育指导纲要 大学生创业指导网 哈师大就业指导处 起亚k5指导价 硕士论文指导 天津大学就业指导中心 欢迎领导莅临指导标语 高考志愿填报指导 高三学习方法指导 生物化学实验指导 学生学习方法指导 初二物理学习指导 初三语文复习指导 高三语文复习指导 初中数学复习指导 高二化学学习指导 理论力学解题指导及习题集 初中历史复习指导 山东省职业技能鉴定指导中心 网络安全法立法指导思想 广东省职业技能鉴定指导中心 中国矿业大学就业指导中心 中国矿业大学就业指导 成都理工大学就业指导中心 热烈欢迎领导莅临指导横幅 幼儿园生活活动指导 初中地理学习方法指导 四年级数学学习指导 大中专毕业生就业指导中心 大学生全程就业指导教程 高职大学生就业指导 职业规划与就业创业指导 高三生物一轮复习指导 现代化学基础学习指导与题解 职业生涯规划与就业指导 幼儿教育心理学学习与指导 大学生职业规划与就业指导 高考专业详细介绍与选择指导 实变函数与泛函分析学习指导 土木工程专业毕业设计指导 幼儿园体育活动设计与指导