函數的遞歸調用 遞歸的含義 遞歸其實也只是一種演算法上的描述,不是一種新的語法! 有時候,我們解決問題的時候,會遇到這種情況,當我們把一個大的問題按照某種解決方案分成若幹個小的問題的時候,發現這些小問題的解決方案其實和剛纔大問題的解決方案又是一樣的! 典型的,比如:求階乘! 10! = 10 * 9! ...
函數的遞歸調用
遞歸的含義
遞歸其實也只是一種演算法上的描述,不是一種新的語法!
有時候,我們解決問題的時候,會遇到這種情況,當我們把一個大的問題按照某種解決方案分成若幹個小的問題的時候,發現這些小問題的解決方案其實和剛纔大問題的解決方案又是一樣的!
典型的,比如:求階乘!
10! = 10 * 9!
9! = 9 * 8!
8! = 8 * 7!
……
語法上,函數的遞歸調用,就是函數在執行的過程中自己又調用自己!
遞歸的兩個要點:
1, 遞歸的出口:就是指什麼時候停止遞歸調用
2, 遞歸點:就是指什麼時候開始使用遞歸調用
在寫遞歸調用的時候,先寫遞歸的出口,再寫遞歸點!
所以,遞歸調用的特點是:代碼書寫比較簡單,但是執行的時候,比較消耗記憶體資源!
也可以說,遞歸的本質就是以空間換取時間!
下麵是通過遞歸遍歷文件夾的一個小案例:
代碼:
<?php /** * 定義遍歷指定路徑下文件與文件夾,通過遞歸的方法 * @param $dir string */ function dirs($dir,$level=0){ //列出指定路徑中的文件和目錄 $files=scandir($dir); //遍歷所有的目錄 foreach($files as $file){ //重覆一個字元串 echo str_repeat(' ',$level*4); //拼接路徑 $tmpdir=$dir.'/'.$file; //判斷是否是一個目錄,文件夾 if(is_dir($tmpdir)){ //讓文件夾變成紅色 echo "<font style='color:red;'>$tmpdir</font><br/>"; //目錄下有兩個隱藏文件.和..,排除掉 if($file !='.' && $file !='..'){ //通過遞歸的方法,調用自己,進行遍歷 dirs($tmpdir,$level+1);//遞歸點 } }else{ //如果不是一個目錄就直接顯示這個文件 echo $file.'<br/>'; } } } dirs('d:/sphinx');
效果:
下篇我會用遞歸的方法來實現無限極分類的小案例。