人生最曼妙的风景,竟是内心的淡定与从容!
從函數的實現功能方面考慮,而不考慮回調過程來理解遞歸.如果考慮回調過程來理解遞歸的話,就要分析整個遞歸過程中的參數和變量,還要記住什麼時候被呼叫函數呼叫回到主呼叫函數,就顯得有些麻煩.對於一些常用的遞歸函數功能很好描述,如递归求解阶乘:
递归求解阶乘
<?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 所以輸出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 所以輸出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直到最開始的值..就這個進到出的關係搞好就行.
謝謝各位,我明白了