php递归函数详解
很多同學在學習遞歸函數的時候會感到頭暈,無法搞清楚遞歸函數的原理和運行機制,本文將給大家詳細講解遞歸函數的運行機制和運用。
?
那什么是遞歸函數呢?
?
遞歸函數即為自調用函數,在函數體內直接或間接自己調用自己,但需要設置自調用的條件,若滿足條件,則調用函數本身,若不滿足則終止本函數的自調用,然后把目前流程的主控權交回給上一層函數來執行,可能這樣給大家講解,還是很難明白。
?>
大家首先思考一下,這個例子最終的輸出結果是什么?
?
好,我們來看一下本函數輸出的結果:
?
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
?
那什么是遞歸函數呢?
?
遞歸函數即為自調用函數,在函數體內直接或間接自己調用自己,但需要設置自調用的條件,若滿足條件,則調用函數本身,若不滿足則終止本函數的自調用,然后把目前流程的主控權交回給上一層函數來執行,可能這樣給大家講解,還是很難明白。
下面就用一個例子為大家詳解遞歸:
<?php ?//聲明一個函數,用于測試遞歸 ?function test($n){ ???echo $n." ";??????? //在函數開始輸出參數的值 ???if($n>0){??????????????? //判斷參數是否大于0 ?????test($n-1);??????????? //如果參數大于0則調用自己,并將參數減1后再次傳入 ???}else{?????????????????? //判斷參數是不大于0 ?????echo "<-------->? "; ???} ???echo $n." "; ?} ?test(10);?????????????????? //調用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
總結
- 上一篇: iPhone X 不充电维修案例
- 下一篇: PHP水果店管理系统,赢通水果店管理系统