本文主要介绍了php中递归的三种基本方法,包括使用引用作为参数、使用全局变量和使用静态变量实现递归,并附有相关示例。最后给大家演示一下,涉及php的递归操作技巧。有需要的朋友可以参考一下。
递归函数是我们经常使用的一种函数。最基本的特点是函数本身调用自己,但调用自己之前必须有条件判断,否则会无限调用。递归函数可以用什么方式实现?本文列举了三种基本方式。理解它原本需要一些基础知识,包括对全局变量、引用和静态变量的理解,也包括对它们作用范围的理解。递归函数也是解决无限分类的好技术。如果对无限分类感兴趣,请参考php用递归函数实现无限分类。我习惯用通俗的话解释复杂的道理,你真的不懂。请参考手册。
利用引用做参数
不管引用是不是参数,首先要明白引用是什么。引用仅仅意味着两个不同名字的变量指向同一个存储地址。本来每个变量都有自己的存储地址,所以赋值和删除各走各的路。现在,两个变量共享一个内存地址。$ a=$ b;实际上,它意味着$a必须与$b共享一个房间,而不管它的原始存储地址。因此,内存地址值的任何变化都会影响这两个值。
函数各有各的方式,即使是同名函数也是如此。递归函数以引用为参数,成为两个函数之间共享数据的桥梁。虽然这两个函数看起来运行在不同的地址,但实际上它们运行在同一个内存地址。
函数测试($a=0,$result=array()){
$ a;
if ($a10) {
$ result[]=$ a;
测试($a,$ result);
}
echo $ a;
返回$ result
}
上面的例子是很简短的回答,以a10为判断条件。如果条件成立,将A赋给result[];将对result的引用传递到函数中会将每次递归生成的添加到结果数组result中。因此,本例中生成的$result数组是array([0]=1[1]=2[2]=3[3]=4[4]=5[5]=6[6]=7[7]=8[8]=9)。
这个例子中比较有意思的是echo a的值,相信很多人以为是12345678910,其实不是。是1098765432。为什么?因为该函数在echoa执行之前的下一次循环。echo a的真正执行是当a10条件不满足时,echo a返回result。对于上层,执行完递归函数后,开始执行本层的echo $a,以此类推。
实施例2,
PHP的引用允许两个变量指向同一个内容,例如$ a=$ b;这意味着$a和$b指向同一个变量。
在下面的示例中,因为$data是通过引用传递的,所以数据将始终累积。
函数递归($data=[],$i=0)
{
如果($i 10) {
$ data[]=$ I;
$ I;
$ this-递归($data,$ I);
}
返回$ data
}
//调用
$ this-recursion();//[0,1,2,3,4,5,6,7,8,9]
利用全局变量
使用全局变量完成递归函数。请确保你真正理解什么是全局变量。在全局函数中声明变量只是对外部变量的同名引用。变量的作用域仍然在这个函数的作用域内。通过改变这些变量的值,同名的外部变量的值自然也会改变。但是一旦使用,同名的变量就不再是同名的引用了。用全局变量来理解递归函数不需要那么深的层次,保持全局变量的原始观点来理解递归函数是符合逻辑的。
函数测试($a=0,$result=array()){
global $ result
$ a;
if ($a10) {
$ result[]=$ a;
测试($a,$ result);
}
返回$ result
}
在全局函数中声明变量只是对外部变量的同名引用。变量的作用域仍然在这个函数的作用域内。通过改变这些变量的值,同名的外部变量的值自然也会改变。
函数递归($data=[],$i=0)
{
全球$数据;
如果($i 10) {
$ data[]=$ I;
$ I;
$ this-递归($data,$ I);
}
返回$ data
}
//调用
$ this-recursion();//[0,1,2,3,4,5,6,7,8,9]
利用静态变量
我们经常在类中看到static,今天我们在递归函数中使用它。请记住static的函数:只在第一次调用函数时初始化变量,并保留变量值。
举个栗子:
功能测试(){
静态$ count=0;
echo $ count
$ count
}
test();
test();
test();
test();
test();
这段代码的执行结果是什么?是00000吗?不一定。01234.第一次调用Test(),静态初始化$count。之后$count的值会在每次执行后保留,不进行初始化,相当于直接忽略静态$ count=0;这句话。
因此,静态在递归函数中应用是可以想象的。需要作为递归函数之间的“桥梁”的变量由static初始化,“桥梁变量”的值会在每次递归中保留。
功能测试($a=0){
static $ result=array();
$ a;
if ($a10) {
$ result[]=$ a;
测试(美元);
}
返回$ result
}
静态变量只在第一次调用时初始化。它只存在于局部函数域中,但当程序执行离开这个范围时,它的值不会丢失。
函数递归($i=0)
{
static $ data=[];
如果($i 10) {
$ data[]=$ I;
$ I;
$ this-递归($ I);
}
返回$ data
}
//调用
$ this-recursion();//[0,1,2,3,4,5,6,7,8,9]
总结
所谓递归函数,重点在于如何处理函数调用本身,如何保证所需结果能够在函数之间合理‘传递’。当然,也有递归函数不需要函数间传递的值,比如:
功能测试($a=0){
$ a;
if ($a10) {
echo $ a;
测试(美元);
}
}
这样的功能我们不用担心。顺便说一句,深入了解变量参考知识有助于解决此类问题。
最后给大家分享一个实现递归和无限分类的php方法。具体实现方法如下:
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
echo pre
$area=array(
数组( id=1, area= Beijing , pid=0),
数组( id=2, area=广西, pid=0),
数组( id=3, area= Guangdong , pid=0),
数组( id=4, area=福建, pid=0),
数组( id=11, area=朝阳区, pid=1),
数组( id=12, area=海淀区, pid=1),
数组( id=21, area=南宁, pid=2),
数组( id=45, area=福州, pid=4),
数组( id=113, area=亚运村, pid=11),
数组( id=115, area= Olympic Village , pid=11),
数组( id=234, area=武鸣县, pid=21)
);
函数t($arr,$pid=0,$lev=0){
static $ list=array();
foreach($arr as $v){
if($v[pid]==$pid){
echo str_repeat(,$lev)。$v[area]。br/;
//这里的输出是看效果。
$ list[]=$ v;
t($arr,$v[id],$ lev 1);
}
}
返回$ list
}
$ list=t($ area);
echo‘HR’;
print _ r($ list);
?
这就是本文关于php递归的三种基本方式。更多相关的php递归,请搜索我们之前的文章或者继续浏览下面的相关文章。希望你以后能支持我们!