程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 對函數及遞歸的通俗理解

對函數及遞歸的通俗理解

編輯:關於PHP編程

沒有基礎的兄弟可能對函數的遞歸比較難以理解,特別是遞歸裡返回輸出的概念理不清,是如何返回的。 下面是課本上的列子,就拿出來,用我的理解來做解釋。希望能幫到對這塊還沒弄懂的兄弟。 <?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 函數和遞歸的使用,最終就是解析成上面的代碼執行的, 這就是我理解的函數,以及遞歸,用一句話說:“本來江湖上是沒有遞歸的,出現的函數多了,也就有了遞歸。” 一點簡單的理解,希望能幫助沒有基礎的兄弟理解函數,理解遞歸,最終形成自己的理解自己的想法和思路

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved