遞歸其實也只是一種演算法上的描述,不是一種新的語法!
有時候,我們解決問題的時候,會遇到這種情況,當我們把一個大的問題按照某種解決方案分成若干個小的問題的時候,發現這些小問題的解決方案其實和剛才大問題的解決方案又是一樣的!
典型的,例如:求階乘!
10! = 10 * 9!
9! = 9 * 8!
8! = 8 * 7!
……
語法上,函數的遞歸調用,就是函數在執行的過程中自己又調用自己!
遞歸的兩個要點:
1, 遞歸的出口:就是指何時停止遞迴呼叫
2, 遞歸點:是指何時開始使用遞迴呼叫
在寫遞歸呼叫的時候,先寫遞歸的出口,再寫遞歸點!
所以,遞迴呼叫的特點是:程式碼書寫比較簡單,但是執行的時候,比較消耗記憶體資源!
也可以說,遞歸的本質就是以空間換取時間!
下面是透過遞歸遍歷資料夾的小案例:
代碼:
<?<span style="color: #000000;">php </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * 定义遍历指定路径下文件与文件夹,通过递归的方法 * @param $dir string </span><span style="color: #008000;">*/</span><span style="color: #000000;"> function dirs($dir,$level</span>=<span style="color: #800080;">0</span><span style="color: #000000;">){ </span><span style="color: #008000;">//</span><span style="color: #008000;">列出指定路径中的文件和目录</span> $files=<span style="color: #000000;">scandir($dir); </span><span style="color: #008000;">//</span><span style="color: #008000;">遍历所有的目录</span> <span style="color: #0000ff;">foreach</span>($files <span style="color: #0000ff;">as</span><span style="color: #000000;"> $file){ </span><span style="color: #008000;">//</span><span style="color: #008000;">重复一个字符串</span> echo str_repeat(<span style="color: #800000;">'</span><span style="color: #800000;"> </span><span style="color: #800000;">'</span>,$level*<span style="color: #800080;">4</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;">拼接路径</span> $tmpdir=$dir.<span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">.$file; </span><span style="color: #008000;">//</span><span style="color: #008000;">判断是否是一个目录,文件夹</span> <span style="color: #0000ff;">if</span><span style="color: #000000;">(is_dir($tmpdir)){ </span><span style="color: #008000;">//</span><span style="color: #008000;">让文件夹变成红色</span> echo <span style="color: #800000;">"</span><span style="color: #800000;"><font style='color:red;'>$tmpdir</font><br/><span style="color: #800000;">"</span><span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;">目录下有两个隐藏文件.和..,排除掉</span> <span style="color: #0000ff;">if</span>($file !=<span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span> && $file !=<span style="color: #800000;">'</span><span style="color: #800000;">..</span><span style="color: #800000;">'</span><span style="color: #000000;">){ </span><span style="color: #008000;">//</span><span style="color: #008000;">通过递归的方法,调用自己,进行遍历</span> dirs($tmpdir,$level+<span style="color: #800080;">1</span>);<span style="color: #008000;">//</span><span style="color: #008000;">递归点</span> <span style="color: #000000;"> } }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{ </span><span style="color: #008000;">//</span><span style="color: #008000;">如果不是一个目录就直接显示这个文件</span> echo $file.<span style="color: #800000;">'</span><span style="color: #800000;"><br/></span><span style="color: #800000;">'</span><span style="color: #000000;">; } } } dirs(</span><span style="color: #800000;">'</span><span style="color: #800000;">d:/sphinx</span><span style="color: #800000;">'</span>);
效果:
下篇我會用遞歸的方法來實現無限極分類的小案例。