PHP 递归函数
遞歸函數(shù)即自調(diào)用函數(shù),在函數(shù)體內(nèi)部直接或間接的自己調(diào)用自己,即函數(shù)的嵌套調(diào)用就是函數(shù)本身。通常
在此類(lèi)型的函數(shù)體中會(huì)附加一個(gè)條件判斷,以判斷是否需要執(zhí)行遞歸調(diào)用,并且在特定的條件下終止函數(shù)的遞歸
調(diào)用動(dòng)作,把目前流程的主控權(quán)交回到上一層函數(shù)執(zhí)行。
總結(jié):1.遞歸是一種函數(shù)調(diào)用自身的機(jī)制2.遞歸必須要有邊界條件,也就是遞歸出口(退出遞歸)3.遞歸前進(jìn)段和遞歸返回段,也就是最后得到的值4.當(dāng)邊界條件(遞歸出口)不滿(mǎn)足的時(shí)候,遞歸前進(jìn);當(dāng)邊界條件(遞歸出口)滿(mǎn)足時(shí),遞歸返回下面我們看一個(gè)簡(jiǎn)單的遞歸示例: <?php // 聲明一個(gè)函數(shù) 用于遞歸測(cè)試 function test($n) {echo $n . " "; //在函數(shù)開(kāi)始輸出參數(shù)的值if($n > 0) { //判斷參數(shù)是否大于0test($n - 1); //如果參數(shù)大于0則調(diào)用自己,并將參數(shù)減1后再次傳入}else{ //判斷參數(shù)不大于0echo "<------>";}echo $n . " "; }test(10);--------------------------------------輸出結(jié)果:10 9 8 7 6 5 4 3 2 1 0 <------>0 1 2 3 4 5 6 7 8 9 10下面我們一步一步解釋一下:
第 1 步:執(zhí)行 test(10),echo 10,因?yàn)?10 > 0,執(zhí)行 test(9),后面還有沒(méi)來(lái)得及執(zhí)行的 echo 10第 2 步:執(zhí)行 test(9),echo 9,因?yàn)?9 > 0,執(zhí)行 test(8),后面還有沒(méi)來(lái)及執(zhí)行的 echo 9第 3 步:執(zhí)行 test(8),echo 8,因?yàn)?8 > 0,執(zhí)行 test(7),后面還有沒(méi)來(lái)得及執(zhí)行的 echo 8第 4 步: 執(zhí)行 test(7),echo 7,因?yàn)?7 > 0,執(zhí)行 test(6),后面還有沒(méi)來(lái)得及執(zhí)行的 echo 7第 5 步:執(zhí)行 test(6),echo 6,因?yàn)?6 > 0,執(zhí)行 test(5),后面還有沒(méi)來(lái)得及執(zhí)行的 echo 6第 6 步:執(zhí)行 test(5),echo 5,因?yàn)?5 > 0,執(zhí)行 test(4),后面還有沒(méi)來(lái)得及執(zhí)行的 echo 5第 7 步 :執(zhí)行 test(4),echo 4,因?yàn)?4 > 0,執(zhí)行 test(3),后面還有沒(méi)來(lái)得及執(zhí)行的 echo 4第 8 步 :執(zhí)行 test(3),echo 3,因?yàn)?3 > 0,執(zhí)行 test(3),后面還有沒(méi)來(lái)得及執(zhí)行的 echo 3第 9 步 :執(zhí)行 test(2),echo 3,因?yàn)?2 > 0,執(zhí)行 test(1),后面還有沒(méi)來(lái)得及執(zhí)行的 echo 2第 10 步 :執(zhí)行 test(1),echo 1,因?yàn)?1 > 0,執(zhí)行 test(0),此時(shí) 0 > 0 不成立不再執(zhí)行 test() 函數(shù),而是echo “<------>”,并且執(zhí)行后面的 echo 0,此時(shí)函數(shù)不再調(diào)用自己,開(kāi)始將流程的主控權(quán)交回給上一層函數(shù)執(zhí)行,
也就是開(kāi)始執(zhí)行剛剛 test() 函數(shù)沒(méi)來(lái)得及輸出的最后一個(gè) echo,整個(gè)流程如下圖所示:
在函數(shù)執(zhí)行的第 1 到第 10 步,函數(shù)輸出的是綠色部分,紅色部分還沒(méi)來(lái)得及輸出就執(zhí)行調(diào)用自己的操作,以此
類(lèi)推,直到流程執(zhí)行到不滿(mǎn)足調(diào)用自己的條件,輸出 “<------>”,流程開(kāi)始執(zhí)行前面沒(méi)來(lái)得及輸出的部分
這就像我們玩游戲一樣,打死一個(gè)怪物掉下一件寶物,但是此時(shí)還有其他怪物在等著被消滅,我們不得不消滅完
所有怪物之后在回來(lái)一個(gè)一個(gè)撿寶物
但是,可能又會(huì)有人問(wèn)為什么在流程執(zhí)行到不滿(mǎn)足調(diào)用自己的條件后下一個(gè)輸出的是 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);-----------------------------輸出結(jié)果:32123執(zhí)行 one(3) 函數(shù),echo 3,然后調(diào)用 two(2) 函數(shù),注意此時(shí)還沒(méi) echo 3
執(zhí)行 two(2),echo 2,然后調(diào)用 three(1) 函數(shù),同樣還沒(méi) echo 2
執(zhí)行 three(1) ,echo 1,不再調(diào)用其他函數(shù)
three() 函數(shù)執(zhí)行結(jié)束 echo 2,則 two() 函數(shù)也執(zhí)行結(jié)束,echo 3,所以,最后的輸出結(jié)果就是 3,2,1,2,3
總結(jié)
- 上一篇: 织梦php 文章采集规则,如何正确写De
- 下一篇: HTML5和CSS3新增