怎么理解递归
来源:互联网 发布:如何恢复电脑网络设置 编辑:程序博客网 时间: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);
- 怎么理解递归
- 怎么更好地终极理解递归算法
- 理解递归
- 理解递归!!
- 理解递归
- 理解 递归
- 递归理解
- 理解递归
- 理解递归
- 递归理解
- 理解递归
- 理解递归
- 理解递归
- 理解递归~
- 理解递归
- 递归 理解
- 学习递归,理解递归
- 递归怎么写
- 敏捷趣味回顾会议-回顾
- 软件工程概览
- 经典SQL语句大全
- iPhone8无线充电怎么实现?
- Redis系列之key操作命令与Redis中的事务详解(六)
- 怎么理解递归
- SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能
- git流程图
- markdown使用
- Toolbar的Title与NavigationIcon距离异常
- HTTP Error 500.23错误
- java中的匿名内部类总结
- Spring Security限制多个用户登录
- 暴力解决recycleview跟scrollview嵌套问题