文章出處
文章列表
例子:
<?php function reverse_r($str) { if(strlen($str)>0) { reverse_r(substr($str,1)); } echo substr($str,0,1); return; } function reverse_i($str) { for($i=1;$i<=strlen($str);$i++) { echo substr($str,-$i,1); } return; } reverse_r('hello'); echo "<br>"; reverse_i('hello'); ?>
輸出為:
olleh olleh
在這個程序清單中實現了兩個函數,這兩個函數都可以以相反的順序打印字符串的內容,函數reverse_r()是通過遞歸實現的,而函數reverse_i()是通過循環實現的。
函數reverse_r()以一個字符串作為輸入參數,當調用他/她的時候,它會繼續調用它自己,每次傳遞從字符串的第二個到最后一個字符,例如,如果調用:
reverse_r('hello');
他會用下面的參數多次調用自己:
reverse_r('ello'); reverse_r('llo'); reverse_r('lo'); reverse_r('o'); reverse_r('');
每次調用這個函數都在服務器的內存中生成一段該函數代碼的新副本,但每次使用的參數是不同的,這有點像我們每次調用不同的函數,這樣會使我們避免將這些函數的調用實例混淆。
在每次調用中,傳入字符串的長度都會被測試,當到達字符串末尾的時候(strlen()==0),條件失敗,最近的一次函數調用(reverse_r(''))會被繼續執行下一行代碼,就是將傳入字符串的第一個字符顯示出來--在這個情況下沒有字符,因為字符串是空的。
下一步,這個函數實例又將控制返回到調用它的實例中,也就是reverse_r('o'),這樣就打印出了字符串的第一個字符("o")然后將控制返回到調用它的實例中。
如此繼續打印一個字符后返回到調用它的上一層函數實例中,知道程序控制返回主程序。
雖然遞歸看上去美觀,但程序員常會忘記給出遞歸的終止條件,這意味者函數會一直沖服下去知道服務器內存耗盡,或者達到最大調用次數。
文章列表
全站熱搜