1. 程式人生 > >php遞迴函式的理解

php遞迴函式的理解

很多同學在學習遞迴函式的時候會感到頭暈,無法搞清楚遞迴函式的原理和執行機制,本文將給大家詳細講解遞迴函式的執行機制和運用。

那什麼是遞迴函式呢?

遞迴函式即為自呼叫函式,在函式體內直接或間接自己呼叫自己,但需要設定自呼叫的條件,若滿足條件,則呼叫函式本身,若不滿足則終止本函式的自呼叫,然後把目前流程的主控權交回給上一層函式來執行,可能這樣給大家講解,還是很難明白。

好,那下面我們就拿高洛峰老師的《細說PHP》中的例子來給大家講解。

<?php
function test($n){
echo $n." ";
if($n>0){
test($n-1);
}else{
echo
"<-->"; } echo $n." "; } test(10); ?>

大家首先思考一下,這個例子最終的輸出結果是什麼?

好,我們來看一下本函式輸出的結果:

10 9 8 7 6 5 4 3 2 1 0 <–> 0 1 2 3 4 5 6 7 8 9 10

怎麼樣,不知道這個結果是否跟大家設想的一樣呢?

好,下面我一步一步來給大家講解…

第一步,執行test(10),echo 10,然後因為10>0,執行test(9),後面還有沒來得及執行的echo 10

第二步,執行test(9),echo 9,然後因為9>0,執行test(8),同樣後面還有沒來得及執行的 echo 9

第三步,執行test(8),echo 8,然後因為8>0,執行test(7),同樣後面還有沒來得及執行的 echo 8

第四步,執行test(7),echo 7,然後因為7>0,執行test(6),同樣後面還有沒來得及執行的 echo 7

第五步,執行test(6),echo 6,然後因為6>0,執行test(5),同樣後面還有沒來得及執行的 echo 6

………..

第十步,執行test(0),echo 0,此時0>0的條件不滿足,不在執行test()函式,而是echo “<–>”,並且執行後面的 echo 0

10 9 8 7 6 5 4 3 2 1 0 <–> 0 1 2 3 4 5 6 7 8 9 10

此時,輸出的內容如上述顯示的紅色部分,此時函式已經不再呼叫自己,開始將流程的主控權交回給上一層函式來執行

也就是開始執行剛剛所有test()函式沒來得及輸出的最後一個echo

它的流程是這樣子的:

在函式執行的第一到第十步,函式輸出的的是綠色部分,紅色部分還“沒來及”輸出,就該呼叫自己執行操作,依次類推,直到流程執行到不再滿足呼叫自己的條件,輸出“<–>”,此時,流程該執行前面“沒來及”輸出的程式碼。

就像我們平時玩的遊戲一樣,打死一個怪物,掉出一個寶貝,但是還有其他怪物在等著你來消滅,你不得不消滅完所有的怪物才能回來一個一個地拾寶貝。

怎麼樣,這麼樣跟大家來講解是不是明白了呢?
有的同學又會問了,我在執行完所有的test函式之後,最終輸出0

也就是輸出到這裡,

10 9 8 7 6 5 4 3 2 1 0 <–> 0

那為什麼下一個輸出的是 1 ,而不是 10 呢,

對於這個問題,為了幫助大家理解,下面我再給大家舉一個例子:

看如下程式碼:

<?php
function one($num){
echo $num;
two($num-1);
echo $num;
}
function two($num){
echo $num;
three($num-1);
echo $num;
}
function three($num){
echo $num;
}
one(3);
?>

以上程式碼對test()函式進行分解操作,我們思考:

執行one(3)函式的時候,同test()函式一樣,首先要輸出3,然後呼叫two(2)函式,

注意,此時還沒有輸出下面的3,

接著走,執行two(2)函式,輸出2,呼叫three(1)函式,同樣,這裡沒有來得及輸出下面的2,

執行three(1),直接輸出1,不在呼叫其它函式,

此時,我們想剛剛的two()函式是不是還沒有執行完,好,接著執行two()函式沒有完成的部分,two()函式執行完之後,也就是輸出下面的2,然後開始執行one()函式沒有執行完的部分,也就是輸出下面的3,此時所有函式執行完畢。

那麼,輸出結果是:

3 2 1 2 3