php自訂函數之遞歸函數LOGIN

php自訂函數之遞歸函數

遞歸函數,遞迴只是一個名字,而遞迴函數的規定:函數體內呼叫函數自己。

這需要一定的思維理解深度,本章學習過程當中,如果你實在是有思維無法跟上的地方,可以跳過本章不用學習。

因為,實際工作中,用遞迴有用到,但是使用量不會很大。遞歸在實際工作中主要用在:文件和資料夾操作的時候有使用到。

解決方法:
萬一你的思維跟不上本章,你可以直接了解本區塊的原理後,用現成的檔案和資料夾處理函數或檔案處理類別就可以。

我說幾個思考上的盲點:

    1.程式碼是從上到下執行的,所有程式碼沒有exit等停止符,函數必須執行完。

    2.如果函數從函數A跳至函數B後,必須把函數B執行完成再執行函數A剩下的程式碼。

    3.遞迴函數必須要能執行完有結束條件,不然函數就會限入死循環。函數會永遠的自我執行下去。

我們來寫一碼碼來理解一下:

<?php

$num = 10;


//调用一次函数A();
A($num);



function A( $arg ){

   echo $arg;

   //在函数A里面去,跑去执行函数B去了
   B($arg);


   echo '我们需要不断的努力,努力到上天都为我们感动';


   echo $arg.'<br />';
}

function B( $number ){

       echo $number;


       echo '俺是狗蛋,执行完了<br />';

}


?>

透過上例大家會發現:

    1.執行函數A到一半的時候,跑去執行了函數B

    2.執行完函數B,先顯示出來的是:“俺是狗蛋,執行完了”,接著顯示的才是:“我們需要不斷的努力,努力到上天都為我們感動」

    3.也就是證明了我們所說思考盲區裡面的內容,程式碼從上到下執行,程式碼必須執行完。

    我們來寫一個簡單的遞歸程式碼,讓函數自己呼叫自己。

<?php

$n = 2;

function dg( $n ){

   echo $n.'<br />';

   $n = $n - 1;

   if($n > 0){
       //在函数体内调用了dg自己哟
       dg($n);

   }else{

       echo '--------------';
   }

   echo '俺是狗蛋,俺还没执行' . $n . '<br />';

}
?>

你猜猜顯示結果是什麼?為什麼這樣?

我們要仔細推理一次:

    1.第一次呼叫dg(),將數字$n = 2傳到dg中,先顯示出來了2

# 2.然後將$n - 1 $n的值為了1

    3.接著判斷$n 是否大於0,肯定是大於0的,所以呼叫遞歸自己,再把自己執行一次。

    4.而第二次在執行自己dg()的時候,而最下面的 echo '俺是狗蛋,俺還沒執行' . $n . '
'; 還沒有執行到。等待執行完成後再來執行

    5.$n此時等於1 ,所以顯示出來1。

    6.$n把自己減了一次,$n的結果為0

    7.$n大於0肯定不成立的,所以顯示了一條:"------ --------"

    8.而這個時候執行:echo '俺是狗蛋,俺還沒執行' . $n . '
';

#    9.第二次執行dg()執行完成。第一次dg()的程式碼還沒執行完,將第4點的餘下程式碼執行完。


下一節
<?php $n = 2; function dg( $n ){ echo $n.'<br />'; $n = $n - 1; if($n > 0){ //在函数体内调用了dg自己哟 dg($n); }else{ echo '--------------'; } echo '俺是狗蛋,俺还没执行' . $n . '<br />'; } ?>
章節課件