php自訂函數(shù)之遞歸函數(shù)
遞歸函數(shù),遞迴只是一個名字,而遞迴函數(shù)的規(guī)定:函數(shù)體內(nèi)呼叫函數(shù)自己。
這需要一定的思維理解深度,本章學(xué)習(xí)過程當(dāng)中,如果你實在是有思維無法跟上的地方,可以跳過本章不用學(xué)習(xí)。
因為,實際工作中,用遞迴有用到,但是使用量不會很大。遞歸在實際工作中主要用在:文件和資料夾操作的時候有使用到。
解決方法:
萬一你的思維跟不上本章,你可以直接了解本區(qū)塊的原理後,用現(xiàn)成的檔案和資料夾處理函數(shù)或檔案處理類別就可以。
我說幾個思考上的盲點:
????1.程式碼是從上到下執(zhí)行的,所有程式碼沒有exit等停止符,函數(shù)必須執(zhí)行完。
????2.如果函數(shù)從函數(shù)A跳至函數(shù)B後,必須把函數(shù)B執(zhí)行完成再執(zhí)行函數(shù)A剩下的程式碼。
????3.遞迴函數(shù)必須要能執(zhí)行完有結(jié)束條件,不然函數(shù)就會限入死循環(huán)。函數(shù)會永遠的自我執(zhí)行下去。
我們來寫一碼碼來理解一下:
<?php $num = 10; //調(diào)用一次函數(shù)A(); A($num); function A( $arg ){ echo $arg; //在函數(shù)A里面去,跑去執(zhí)行函數(shù)B去了 B($arg); echo '我們需要不斷的努力,努力到上天都為我們感動'; echo $arg.'<br />'; } function B( $number ){ echo $number; echo '俺是狗蛋,執(zhí)行完了<br />'; } ?>
透過上例大家會發(fā)現(xiàn):
????1.執(zhí)行函數(shù)A到一半的時候,跑去執(zhí)行了函數(shù)B
????2.執(zhí)行完函數(shù)B,先顯示出來的是:“俺是狗蛋,執(zhí)行完了”,接著顯示的才是:“我們需要不斷的努力,努力到上天都為我們感動」
????3.也就是證明了我們所說思考盲區(qū)裡面的內(nèi)容,程式碼從上到下執(zhí)行,程式碼必須執(zhí)行完。
????我們來寫一個簡單的遞歸程式碼,讓函數(shù)自己呼叫自己。
<?php $n = 2; function dg( $n ){ echo $n.'<br />'; $n = $n - 1; if($n > 0){ //在函數(shù)體內(nèi)調(diào)用了dg自己喲 dg($n); }else{ echo '--------------'; } echo '俺是狗蛋,俺還沒執(zhí)行' . $n . '<br />'; } ?>
你猜猜顯示結(jié)果是什麼?為什麼這樣?
我們要仔細推理一次:
????1.第一次呼叫dg(),將數(shù)字$n = 2傳到dg中,先顯示出來了2
# 2.然後將$n - 1 $n的值為了1
????3.接著判斷$n 是否大於0,肯定是大於0的,所以呼叫遞歸自己,再把自己執(zhí)行一次。
????4.而第二次在執(zhí)行自己dg()的時候,而最下面的?echo '俺是狗蛋,俺還沒執(zhí)行' . $n . '
';?還沒有執(zhí)行到。等待執(zhí)行完成後再來執(zhí)行
????5.$n此時等於1 ,所以顯示出來1。
????6.$n把自己減了一次,$n的結(jié)果為0
????7.$n大於0肯定不成立的,所以顯示了一條:"------ --------"
????8.而這個時候執(zhí)行:echo '俺是狗蛋,俺還沒執(zhí)行' . $n . '
';
#????9.第二次執(zhí)行dg()執(zhí)行完成。第一次dg()的程式碼還沒執(zhí)行完,將第4點的餘下程式碼執(zhí)行完。