人生最曼妙的风景,竟是内心的淡定与从容!
从函数的实现功能方面考虑,而不考虑回调过程来理解递归.如果考虑回调过程来理解递归的话,就要分析整个递归过程中的参数和变量,还要记住什么时候被调用函数调用返回到主调用函数,就显得有些麻烦.对于一些常用的递归函数功能很好描述,如递归求解阶乘:
递归求解阶乘
<?php function factorial($n) { if ($n != 1) $res = $n * factorial($n-1); else $res = 1; return $res; } ?>
函数功能就是: 计算 n 的阶乘, 函数功能实现就是: n 的阶乘 = n * (n-1)的阶乘.这样理解就不用考虑递归过程中的函数调用问题.
计算 n 的阶乘
n 的阶乘 = n * (n-1)的阶乘
对于题主的函数:函数功能就是: 输入 n,输出 n+1, 如果 n+1<5,执行 fun(n+1),再输出 n+1(不好用一个简短的句子描述):所以根据功能描述,可以得到函数的执行过程,最后得到结果.
输入 n,输出 n+1, 如果 n+1<5,执行 fun(n+1),再输出 n+1
执行 fun(1): 输入 1, 输出 2, 2+1<5,执行 fun(2),得到 fun(2) 输出的结果,再输出 2. 最终输出: 2[输出(fun(2))]2
fun(1)
fun(2)
同样,fun(2)输出结果: 3[输出(fun(3))]3 最终输出:23[输出(fun(3))]32
同样,fun(3)输出结果: 4[输出(fun(4))]4 最终输出:234[输出(fun(4))]432
fun(3)
执行fun(4): 由于 4+1<5 判断失败, 不执行 fun(5),输出结果: 55最终输出:23455432
fun(4)
fun(5)
递归返回的时候,这句话就会倒着输出
函数是没有异步所以你执行fun(1)2 $i++; echo $i;3 回调func(2) $i++; echo $i;4 回调func(3) $i++; echo $i; 5 回调func(4) $i++; echo $i;5 回调func(4) 因为$i++之后,已经大于5所以执行下面的echo $i(fun(4)最底下的echo $i,此时fun(4)整个函数执行结束)4 由于func(4)执行完成,所以会继续执行fun(3) 最底下的echo $i3 2 也是这样的逻辑
fun函数递归时,在判断$i < 5满足时,会调用自身,此时入栈,同时留下了函数的最后一句echo $i没有执行;当递归调用到$i = 5;此时开始返回到函数上一个栈点,继续执行。即执行函数中的最后一句echo $i;所以输出4,然后返回上次入栈的地方,继续输出3 ....直到fun函数完全返回。改为if ($i < 5) { return fun($i);}将会输出23455
if ($i < 5) { return fun($i);}
可以参考下这篇文章,理解了递归也就清楚了。http://www.jianshu.com/p/8bee...
你可以这样想, 这个函数起作用的就是前半部分echo了i,后半部分echo了i,中间插了个调用自身直到i=5,相当于echo i直到5,再倒回来echo直到最开始的值..就这个进到出的关系搞好就行.
谢谢各位,我明白了
从函数的实现功能方面考虑,而不考虑回调过程来理解递归.
如果考虑回调过程来理解递归的话,就要分析整个递归过程中的参数和变量,还要记住什么时候被调用函数调用返回到主调用函数,就显得有些麻烦.
对于一些常用的递归函数功能很好描述,如
递归求解阶乘
:函数功能就是:
计算 n 的阶乘
, 函数功能实现就是:n 的阶乘 = n * (n-1)的阶乘
.这样理解就不用考虑递归过程中的函数调用问题.对于题主的函数:
函数功能就是:
输入 n,输出 n+1, 如果 n+1<5,执行 fun(n+1),再输出 n+1
(不好用一个简短的句子描述):所以根据功能描述,可以得到函数的执行过程,最后得到结果.
执行
fun(1)
: 输入 1, 输出 2, 2+1<5,执行fun(2)
,得到fun(2)
输出的结果,再输出 2.最终输出: 2[输出(fun(2))]2
同样,
fun(2)
输出结果: 3[输出(fun(3))]3最终输出:23[输出(fun(3))]32
同样,
fun(3)
输出结果: 4[输出(fun(4))]4最终输出:234[输出(fun(4))]432
执行
fun(4)
: 由于 4+1<5 判断失败, 不执行fun(5)
,输出结果: 55最终输出:23455432
递归返回的时候,这句话就会倒着输出
![](http://img.php.cn/upload/image/000/000/000/e4103c2cb3462d85e5ceb6499c9d0087-0.png)
函数是没有异步
所以你执行fun(1)
2 $i++; echo $i;
3 回调func(2) $i++; echo $i;
4 回调func(3) $i++; echo $i;
5 回调func(4) $i++; echo $i;
5 回调func(4) 因为$i++之后,已经大于5所以执行下面的echo $i(fun(4)最底下的echo $i,此时fun(4)整个函数执行结束)
4 由于func(4)执行完成,所以会继续执行fun(3) 最底下的echo $i
3 2 也是这样的逻辑
fun函数递归时,在判断$i < 5满足时,会调用自身,此时入栈,同时留下了函数的最后一句echo $i没有执行;当递归调用到$i = 5;此时开始返回到函数上一个栈点,继续执行。即执行函数中的最后一句echo $i;
所以输出4,然后返回上次入栈的地方,继续输出3 ....直到fun函数完全返回。改为
if ($i < 5) { return fun($i);}
将会输出23455可以参考下这篇文章,理解了递归也就清楚了。http://www.jianshu.com/p/8bee...
你可以这样想, 这个函数起作用的就是前半部分echo了i,后半部分echo了i,中间插了个调用自身直到i=5,相当于echo i直到5,再倒回来echo直到最开始的值..就这个进到出的关系搞好就行.
![](http://img.php.cn/upload/image/000/000/000/9eda7fa7dce07c04548a8fc744e3968f-0.png)
谢谢各位,我明白了