PHP 遞歸函數


      遞歸函數即自調用函數,在函數體內部直接或間接的自己調用自己,即函數的嵌套調用就是函數本身。通常

在此類型的函數體中會附加一個條件判斷,以判斷是否需要執行遞歸調用,並且在特定的條件下終止函數的遞歸

調用動作,把目前流程的主控權交回到上一層函數執行。

       總結:

       1.遞歸是一種函數調用自身的機制

       2.遞歸必須要有邊界條件,也就是遞歸出口(退出遞歸)

       3.遞歸前進段和遞歸返回段,也就是最后得到的值

       4.當邊界條件(遞歸出口)不滿足的時候,遞歸前進;當邊界條件(遞歸出口)滿足時,遞歸返回

       下面我們看一個簡單的遞歸示例:

<?php
// 聲明一個函數 用於遞歸測試
function test($n) {
	echo $n . "&nbsp;";      //在函數開始輸出參數的值
    if($n > 0) {             //判斷參數是否大於0
		test($n - 1);        //如果參數大於0則調用自己,並將參數減1后再次傳入
	}else{                   //判斷參數不大於0
		echo "<------>";
	}

    echo $n . "&nbsp;";
}

test(10);

--------------------------------------

輸出結果:

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

  下面我們一步一步解釋一下:

        第 1 步:執行 test(10),echo 10,因為 10 > 0,執行 test(9),后面還有沒來得及執行的 echo 10

        第 2 步:執行 test(9),echo 9,因為 9 > 0,執行 test(8),后面還有沒來及執行的 echo 9

        第 3 步:執行 test(8),echo 8,因為 8 > 0,執行 test(7),后面還有沒來得及執行的 echo 8

        第 4 步: 執行 test(7),echo 7,因為 7 > 0,執行 test(6),后面還有沒來得及執行的 echo 7

        第 5 步:執行 test(6),echo 6,因為 6 > 0,執行 test(5),后面還有沒來得及執行的 echo 6

        第 6 步:執行 test(5),echo 5,因為 5 > 0,執行 test(4),后面還有沒來得及執行的 echo 5

        第 7 步 :執行 test(4),echo 4,因為 4 > 0,執行 test(3),后面還有沒來得及執行的 echo 4

        第 8 步 :執行 test(3),echo 3,因為 3 > 0,執行 test(3),后面還有沒來得及執行的 echo 3

        第 9 步 :執行 test(2),echo 3,因為 2 > 0,執行 test(1),后面還有沒來得及執行的 echo 2

        第 10 步 :執行 test(1),echo 1,因為 1 > 0,執行 test(0),此時 0 > 0 不成立不再執行 test() 函數,而是

echo "<------>",並且執行后面的 echo 0,此時函數不再調用自己,開始將流程的主控權交回給上一層函數執行,

也就是開始執行剛剛 test() 函數沒來得及輸出的最后一個 echo,整個流程如下圖所示:

        

        在函數執行的第 1 到第 10 步,函數輸出的是綠色部分,紅色部分還沒來得及輸出就執行調用自己的操作,以此

類推,直到流程執行到不滿足調用自己的條件,輸出 "<------>",流程開始執行前面沒來得及輸出的部分

        這就像我們玩游戲一樣,打死一個怪物掉下一件寶物,但是此時還有其他怪物在等着被消滅,我們不得不消滅完

所有怪物之后在回來一個一個撿寶物

         但是,可能又會有人問為什么在流程執行到不滿足調用自己的條件后下一個輸出的是 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);

-----------------------------

輸出結果:

32123

  執行 one(3) 函數,echo 3,然后調用 two(2) 函數,注意此時還沒 echo 3

       執行 two(2),echo 2,然后調用 three(1) 函數,同樣還沒 echo 2

       執行 three(1) ,echo 1,不再調用其他函數

 

       three() 函數執行結束 echo 2,則 two() 函數也執行結束,echo 3,所以,最后的輸出結果就是 3,2,1,2,3

         


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM