沒有基礎的兄弟可能對函數的遞歸比較難以理解,特別是遞歸裡返回輸出的概念理不清,是如何返回的。 下面是課本上的列子,就拿出來,用我的理解來做解釋。希望能幫到對這塊還沒弄懂的兄弟。 <?php function test($n){ echo $n."nbsp"; if($n>0){ test($n-1);//調用函數本身。 }else{ echo "<--->"; } echo $n."$nbsp"; } test(3);//調用函數輸出。 ?> 得到結果是 3 2 1 0 <---> 0 1 2 3 大家比較容易理解的是前面輸出的3 2 1 0 但對於後面的 0 1 2 3 為什麼輸出不是很清楚。 要理解這個遞歸的回歸輸出先要弄清楚,什麼是函數, 官方解釋: 函數(function)是一段完成指定任務的已命名代碼塊。 使用函數的理由中有一條是: 可提高程序的重用性 重用性就是可以重復使用,不多次編寫相同代碼。 就是將程序中重復編寫的代碼寫成函數,然後在其他多處需要使用時只用調用函數名就可使用,而不用再次重復編寫相同代碼。 通俗簡單點講,函數就是一段已經寫好的代碼一把已經造好的槍,然後將它放在了公共倉庫裡, 不同功能的函數都有自己的名字【function 函數名(){}】,如同不同功能的槍也有自己的名字,如來福槍,狙擊槍,手槍等,這些取好名的函數和槍都已經編寫好,造好,放在倉庫。 然後有誰想使用某個功能的函數時,到這個倉庫裡喊這個函數的名字【函數名()】,就將函數拿了出來使用,如同警察依據任務的不同要求到倉庫裡拿不同功能的槍一樣。 ————這就是函數的定義。 函數的使用: 官方的叫法就是:調用 如 aaa(); 通俗的理解就是:那個誰誰誰(叫函數的名字)過來這裡,把交給你的代碼給我在這個位置寫一遍。 我的理解是,就是是替換,函數的調用就是一個占位符,遇到了這個占位符【aaa()】就替換成這個占位符【aaa()】指定的已經寫好的函數裡的代碼。遇到就替換,然後程序繼續按先後的順序往下執行。 具體例子說明: /*=============裝函數(手槍)的倉庫=======================*/ function test($n){ echo $n."nbsp"; if($n>0){ test($n-1);//調用函數本身。 }else{ echo "<--->"; } echo $n."$nbsp"; } /*=============裝函數(手槍)的倉庫======================*/ test(3); //調用函數,按我的想的就是遇到了占位符了,要替換名字叫test的那個函數裡的代碼,(你也可以理解成到倉庫裡拿叫test的槍裝入3發子彈) 於是test(3)第一次遇到變成了 /***********************第一次調用時替換************************/ echo $n."nbsp"; //這個時候$n=3 子彈是三發 if($n>0){ //判斷$n為3大於0 , 執行下邊的 test($n-1); //再次遇到調用函數,遇到就替換,(子彈打出去一發) }else{ echo "<--->"; //不執行 } echo $n."$nbsp"; // 這個時候$n=3,所以輸出3 /***********************第一次調用時替換************************/ /***********************第二次調用時替換************************/ echo $n."nbsp"; //這個時候$n=3 子彈是三發 if($n>0){ //判斷$n>3 執行下邊的 echo $n."nbsp"; //這個時候$n=2 子彈是二發 if($n>0){ //判斷$n為2大於0, 執行下邊的 test($n-1); //再次遇到調用函數,遇到就替換,(子彈再打出去一發) }else{ echo "<--->"; //不執行 } echo $n."$nbsp";//這個時候$n=2,所以輸出2 }else{ echo "<--->"; //不執行 } echo $n."$nbsp"; //這個時候$n=3,所以輸出3 /***********************第二次調用時替換************************/ /***********************第三次調用時替換************************/ echo $n."nbsp"; //這個時候$n=3 子彈是三發 if($n>0){ //判斷$n>3 執行下邊的 echo $n."nbsp"; //這個時候$n=2 子彈是二發 if($n>0){ //判斷$n為2大於0, 執行下邊的 echo $n."nbsp"; //這個時候$n=1 子彈是一發 if($n>0){ //判斷$n為1 大於0, 執行下邊的 test($n-1); //再次遇到調用函數,遇到就替換,(子彈打出去一發) }else{ echo "<--->"; //不執行 } echo $n."$nbsp"; // 這個時候$n=1,所以輸出1 }else{ echo "<--->"; //不執行 } echo $n."$nbsp";//這個時候$n=2,所以輸出2 }else{ echo "<--->"; //不執行 } echo $n."$nbsp"; //這個時候$n=3,所以輸出3 /***********************第三次調用時替換************************/ /***********************第四次調用時替換************************/ echo $n."nbsp"; //這個時候$n=3 子彈是三發 if($n>0){ //判斷$n>3 執行下邊的 echo $n."nbsp"; //這個時候$n=2 子彈是二發 if($n>0){ //判斷$n為2大於0, 執行下邊的 echo $n."nbsp"; //這個時候$n=1 子彈是一發 if($n>0){ //判斷$n為1 大於0, 執行下邊的 echo $n."nbsp"; //這個時候$n=0 子彈是0發 if($n>0){ //判斷$n為0等於0 ,不執行下邊的 test($n-1); //因為不執行所以就不替換了。 }else{ echo "<--->"; //輸出<----> } echo $n."$nbsp"; // 這個時候$n=0,所以輸出0 }else{ echo "<--->"; //不執行 } echo $n."$nbsp"; // 這個時候$n=1,所以輸出1 }else{ echo "<--->"; //不執行 } echo $n."$nbsp";//這個時候$n=2,所以輸出2 }else{ echo "<--->"; //不執行 } echo $n."$nbsp"; //這個時候$n=3,所以輸出3 /***********************第四次調用時替換************************/ /*##################最終得到只有if判斷語句和基礎表達式組成的代碼###########################*/ test(3);//在最開始的時候只調用一次替換; //$n=3 echo $n."nbsp";//輸出3 if($n>0){ //test(3-1)替成了下面的 echo $n."nbsp";//輸出2 if($n>0){ //test(2-1)替成了下面的 echo $n."nbsp";//輸出1 if($n>0){ //test(1-1)替成了下面的 echo $n."nbsp";//輸出0 if($n>0){//判斷執行 //test()沒有替換 test($n-1);//不執行 因為不大約0 }else{ echo "<--->";//輸出<---> } echo $n."$nbsp";//輸出0 }else{ echo "<--->";//不執行 } echo $n."$nbsp";//輸出1 }else{ echo "<--->";//不執行 } echo $n."$nbsp";//輸出2 }else{ echo "<--->";////不執行 } echo $n."$nbsp";//輸出3 /*##################最終得到###########################*/ 按照最終得到的代碼依次輸出的結果就是 輸出結果就是 3 2 1 0 <--> 0 1 2 3 函數和遞歸的使用,最終就是解析成上面的代碼執行的, 這就是我理解的函數,以及遞歸,用一句話說:“本來江湖上是沒有遞歸的,出現的函數多了,也就有了遞歸。” 一點簡單的理解,希望能幫助沒有基礎的兄弟理解函數,理解遞歸,最終形成自己的理解自己的想法和思路