遞迴函式為自調用函數,在函數體內直接或間接自己調用自己,但需要設定自調用的條件,若滿足條件,則調用函數本身,若不滿足則終止本函數的自調用,然後把目前流程的主控權交回給上一層函數來執行,可能這樣給大家講解,還是很難明白,直接上例子
function test ($n){
echo $n.” “;
if($n>0){
test($n-1);
}else{
echo “<–>”;
}
echo $n.” ”
}
test(2)
這個例子最終的輸出結果是2 1 0<–>0 1 2
我解釋下 為何輸出是這樣的
第一步,執行test(2),echo 2,然後因為2>0,執行test(1), 後面還有沒來得及執行的echo 2
第二步,執行test(1),echo 1,然後因為1>0,執行test(0),同樣後面還有沒來得及執行的 echo 1
第三步,執行test(0),echo 0,執行test(0),echo 0, 此時0>0的條件不滿足,不在執行test()函數,而是echo “<–>”,並且執行後面的 echo 0
此時函數已經不再調用自己,開始將流程的主控權交回給上一層函數來執行,也就是開始執行剛剛所有test()函數沒來得及輸出的最後一個echo,0的一層是1也就是輸出1 1的上一層是2 也就是輸出2 2沒有山一層 所以呢 輸出的內容就是2 1 0<–>0 1 2
例子
,我們要遍曆一個檔案夾裡面的所有目錄,列出裡面所有的檔案,PHP本身內建的有一個readdir的函數,不過只能讀取當前的目錄,根據這個函數,我寫了另外一個函數,用來實現我的需求。函數的原理很簡單,主要就是用了一下遞迴調用。
function file_list($path){
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if (is_dir($path."/".$file)) {
echo $path.": ".$file."<br>";//去掉此行顯示的是所有的非目錄檔案
file_list($path."/".$file);
} else {
echo $path.": ".$file."<br>";
}
}
}
}
}
例子
遞迴的應用
中序遍曆二叉樹
void inorder (BinTree T){
if (T){
inorder(T->lchild);
printf(“%c”,T->data);
inorder(T->rchild);
}
}