遞歸函數即爲自調用函數,在函數體內直接或間接本身調用本身,但須要設置自調用的條件,若知足條件,則調用函數自己,若不知足則終止本函數的自調用,而後把目前流程的主控權交回給上一層函數來執行,可能這樣給你們講解,仍是很難明白。 好,那下面咱們就拿高洛峯老師的《細說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 怎麼樣,你們這樣理解起來是否是會容易些呢? 若是仍是不太明白,請在下邊跟帖提問,也請給出寶貴建議,我將會作出相應改進和講解。