php实现递归的三种基本方式有哪些,PHP递归

php实现递归的三种基本方式有哪些,PHP递归,php实现递归的三种基本方式

本文主要介绍了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递归,请搜索我们之前的文章或者继续浏览下面的相关文章。希望你以后能支持我们!

php实现递归的三种基本方式有哪些,PHP递归