PHPz2017-05-24 11:36:32
從函數的實現功能方面考慮,而不考慮回調過程來理解遞歸.
如果考慮回調過程來理解遞歸的話,就要分析整個遞歸過程中的參數和變量,還要記住什麼時候被呼叫函數呼叫回到主呼叫函數,就顯得有些麻煩.
對於一些常用的遞歸函數功能很好描述,如递归求解阶乘
:
<?php
function factorial($n) {
if ($n != 1)
$res = $n * factorial($n-1);
else
$res = 1;
return $res;
}
?>
函數函數就是: 计算 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
为情所困2017-05-24 11:36:32
函式是沒有非同步
所以你執行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 也是這樣的邏輯
世界只因有你2017-05-24 11:36:32
fun函數遞歸時,在判斷$i < 5滿足時,會呼叫自身,此時入棧,同時留下了函數的最後一句echo $i沒有執行;當遞歸調用到$i = 5;此時開始返回函數上一個棧點,繼續執行。即執行函數中的最後一句echo $i;
所以輸出4,然後返回上次入棧的地方,繼續輸出3 ....直到fun函數完全返回。改為if ($i < 5) { return fun($i);}
將會輸出23455
天蓬老师2017-05-24 11:36:32
你可以這樣想, 這個函數起作用的就是前半部echo了i,後半部echo了i,中間插了個調用自身直到i=5,相當於echo i直到5,再倒回來echo直到最開始的值..就這個進到出的關係搞好就行.