84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
<?php function fun($i) { $i++; echo $i; if ($i<5) { fun($i); } echo $i; } fun(1); 我以为结果会是:23455,实际上是23455432,请问这个432是什么情况?
人生最曼妙的风景,竟是内心的淡定与从容!
从函数的实现功能方面考虑,而不考虑回调过程来理解递归.如果考虑回调过程来理解递归的话,就要分析整个递归过程中的参数和变量,还要记住什么时候被调用函数调用返回到主调用函数,就显得有些麻烦.对于一些常用的递归函数功能很好描述,如递归求解阶乘:
递归求解阶乘
<?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
递归返回的时候,这句话就会倒着输出
函數是沒有異步
所以你執行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直到最开始的值..就这个进到出的关系搞好就行.
谢谢各位,我明白了