傻瓜式理解递归之php递归
写程序这么久了,有时候别人会问道一些算法比如排序啊,递归啊,总是不知道该怎么去说,今天就来整理一下,让更多的人去傻瓜式的理解递归。递归在网络上有很多定义,但有这么一句话听的最多:递归就是自己调用自己!引用百科的一个故事去理解:
从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”
这样的故事是不是在做很多重复的事情,像这样的情况下就可以使用递归,递归需要几个条件:
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;
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);
随后会加一些递归的例子,待续,如果写的有什么不清楚的地方,请批判我
傻瓜式理解递归之php递归的更多相关文章
- 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token
为什么你学不会递归?告别递归,谈谈我的一些经验 可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...
- python基础知识15---三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
阅读目录 一 三元表达式.列表推导式.生成器表达式 二 递归与二分法 三 匿名函数 四 内置函数 五 阶段性练习 一. 三元表达式.列表推导式.生成器表达式 1 三元表达式 name=input('姓 ...
- python 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
http://www.cnblogs.com/linhaifeng/articles/7580830.html 三元表达式.列表推导式.生成器表达式.递归.匿名函数.内置函数
- python 三元表达式 列表推导式,生成器表达式。递归,匿名函数, 内置函数
三元表达式 三元表达式仅应用于: 1.条件成立返回一个值 2.条件不成立返回一个值 res = x if x>y else y print(res) name= input("姓名&g ...
- [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐
[翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...
- AJPFX:递归与非递归之间的转化
在常规表达式求值中: 输入为四则运算表达式,仅由数字.+.-.*./ .(.) 组成,没有空格,要求求其值. 我们知道有运算等级,从左至右,括号里面的先运算,其次是* ./,再是+.- : 这样我们就 ...
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- 记住经典的斐波拉契递归和阶乘递归转换为while规律
记住经典的斐波拉契递归和阶乘递归转换为while规律.它为实现更复杂转换提供了启发性思路. # 斐波拉契--树形递归 def fab(n): if n<3: return n return fa ...
随机推荐
- perl 对象
唯一标识: 很明显,一个%employee 是不够的,每个雇员都要求有一个唯一标识和他或她自己的属性集合. 你可以动态的分配这个数据结构,也可以返回一个指向局部数据结构的引用 Vsftp:/root/ ...
- CopyOnWriteArrayList与Collections.synchronizedList的性能对比
列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ...
- linux ERROR: ld.so: object '/lib/libcwait.so' from /etc/ld.so.preload cannot be preloaded: ignored.
[root@ora9i 3238244]# lsb_release -a LSB Version: :core-3.0-amd64:core-3.0-ia32:core-3.0-noarch:g ...
- 一起啃PRML - 1.2.3 Bayesian probabilities 贝叶斯概率
一起啃PRML - 1.2.3 Bayesian probabilities 贝叶斯概率 @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ 这一节简单讲 ...
- 【转】VirtualBox下Ubuntu共享文件
原文网址:http://www.it165.net/os/html/201209/3435.html 今天想从主机上拷贝几个文件到 VirtualBox 的 Ubuntu 下, 但是, Virtual ...
- linux .o,.a,.so文件解析
linux下文件的类型是不依赖于其后缀名的,但一般来讲:.o,是目标文件,相当于windows中的.obj文件.so 为共享库,是shared object,用于动态连接的,和dll差不多.a为静态库 ...
- linux中替换目录下的某个文件中包含的IP地址
#!/bin/bash #set -x oldIP=172.17.39.135 newIP=172.17.98.115 homefile=/usr/local/ims/ filelist=`grep ...
- Bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 最短路,floyd
1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5 ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 128[Submit][Status ...
- 5 weekend01、02、03、04、05、06、07的分布式集群的HA测试 + hdfs--动态增加节点和副本数量管理 + HA的java api访问要点
weekend01.02.03.04.05.06.07的分布式集群的HA测试 1) weekend01.02的hdfs的HA测试 2) weekend03.04的yarn的HA测试 1) wee ...