递归其实也只是一种算法上的描述,不是一种新的语法!
有时候,我们解决问题的时候,会遇到这种情况,当我们把一个大的问题按照某种解决方案分成若干个小的问题的时候,发现这些小问题的解决方案其实和刚才大问题的解决方案又是一样的!
典型的,比如:求阶乘!
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><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>);
效果:
下篇我会用递归的方法来实现无限极分类的小案例。