php递归函数三种方式
(资料图片)
主要介绍了php实现递归的三种基本方法,包括利用引用做参数,利用全局变量,利用静态变量来实现递归,并附上了相关示例,最后给大家一个演示,涉及php的递归操作技巧,需要的朋友可以参考下。
递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去。实现递归函数可以采取什么方式呢?本文列出了三种基本方式。理解其原来需要一定的基础知识水品,包括对全局变量,引用,静态变量的理解,也需对他们的作用范围有所理解。递归函数也是解决无限级分类的一个很好地技巧。如果对无限级分类感兴趣,请参照php利用递归函数实现无限级分类。我习惯套用通俗的话解释复杂的道理,您确实不明白请参见手册。
利用引用做参数
先不管引用做不做参数,必须先明白引用到底是什么?引用不过是指两个不同名的变量指向同一块存储地址。本来每个变量有各自的存储地址,赋值删除各行其道。现在可好,两个变量共享一块存储地址。 $a=&$b; 。实际上指的是 $a 不管不顾自己原来的存储地址,非要和 $b 共享一室了。因而任何对存储地址数值的改变都会影响两个值。
函数之间本来也是各行其是,即便是同名函数。递归函数是考虑将引用作为参数,成为一个桥梁,形成两个函数间的数据共享。虽然两个函数见貌似操作的是不同地址,但是实际上操作的是一块儿内存地址。
function test($a=0,&$result=array()){
$a++;
if ($a<10) {
$result[]=$a;
test($a,$result);
}
echo $a;
return $result;
}
上面的例子非常简答,以a<10作为判断条件,条件成立,则把a赋给result[];将result的引用传入函数,会将每一次递归产生的a添加到结果数组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是当a<10条件不满足的时候,echo a,返回result,对于上一层而言,执行完递归函数,开始执行本层的echo $a,依次类推。
利用全局变量
利用全局变量完成递归函数,请确保你确实理解什么是全局变量。global在函数内申明变量不过是外部变量的同名引用。变量的作用范围仍然在本函数范围内。改变这些变量的"值,外部同名变量的值自然也改变了。但一旦用了&,同名变量不再是同名引用。利用全局变量实现递归函数没必要理解到这么深的一层,还保持原有对全局变量的看法就可以顺理成章理解递归函数。 function test(){
static $count=0;
echo $count;
$count++;
}
test();
test();
test();
test();
test();
请问这一段代码的执行结果是多少?是00000么?必然不是。是01234。首先第一次调用test(),static对 $count 进行初始化,其后每一次执行完都会保留 $count 的值,不再进行初始化,相当于直接忽略了 static $count=0; 这一句。
因而将static应用到递归函数作用可想而知。在将需要作为递归函数间作为“桥梁"的变量利用static进行初始化,每一次递归都会保留"桥梁变量"的值。 function test($a=0){
static $result=array();
$a++;
if ($a<10) {
$result[]=$a;
test($a);
}
return $result;
}
总结
所谓递归函数,重点是如何处理函数调用自身是如何保证所需要的结果得以在函数间合理"传递",当然也有不需要函数之间传值得递归函数,例如: function test($a=0){
$a++;
if ($a<10) {
echo $a;
test($a);
}
}
面对这样的函数,我们就不必大伤脑筋了。顺便说一句,深入理解变量引用相关知识对解决这类问题大有裨益。
最后给大家分享一个php实现递归与无限分类的方法,具体实现方法如下:
echo "
";$area = array(
array("id"=>1,"area"=>"北京","pid"=>0),
array("id"=>2,"area"=>"广西","pid"=>0),
array("id"=>3,"area"=>"广东","pid"=>0),
array("id"=>4,"area"=>"福建","pid"=>0),
array("id"=>11,"area"=>"朝阳区","pid"=>1),
array("id"=>12,"area"=>"海淀区","pid"=>1),
array("id"=>21,"area"=>"南宁市","pid"=>2),
array("id"=>45,"area"=>"福州市","pid"=>4),
array("id"=>113,"area"=>"亚运村","pid"=>11),
array("id"=>115,"area"=>"奥运村","pid"=>11),
array("id"=>234,"area"=>"武鸣县","pid"=>21)
);
function t($arr,$pid=0,$lev=0){
static $list = array();
foreach($arr as $v){
if($v["pid"]==$pid){
echo str_repeat(" ",$lev).$v["area"]."
";//这里输出,是为了看效果
$list[] = $v;
t($arr,$v["id"],$lev+1);
}
}
return $list;
}
$list = t($area);
echo "
";print_r($list);
?>
下一篇:最后一页
php递归函数三种方式主要介绍了php实现递归的三种基本方法,包括利用引用做参数,利用全局变量,利用静态...
如何帮助孩子度过学习倦怠期,你一定要知道这个
2月14日盘中消息,14点52分*ST未来(600532)触及涨停板。目前价格12 0,上涨4 99%。其所属行业煤炭开...
关于感动作文300字七篇无论是身处学校还是步入社会,大家都经常看到作文的身影吧,借助作文人们可以实现...
此游戏攻略仅供三测使用,公测待定白露,雷系丰饶角色,定位:辅助(奶妈)遗器推荐:4过客套(必备)+2...
近期以来,锡林郭勒盟力争以更加优良的环境、更加便利的服务,让各
元隆雅图(002878)02月14日在投资者关系平台上答复了投资者关心的问题。
康波全称是康德拉季耶夫常波,康波周期也可以称为长周期或超长周期理论。简单来说,有一个叫康德拉季耶...
同花顺数据中心显示,中自科技2月13日获融资买入1227 43万元,占当日买入金额的23 17%,当前融资余额6...
床太大怎么利用起来,可以在床上安装一个可折叠式电脑桌,方便在床上办公;也可在床的两侧安装柜子,储...
1、保险粉学名叫连二亚硫酸钠,分子式为Na2S2O4。2、连二亚硫酸钠,也称为保险粉,是一种无机物,化学式为Na2S2O
乱世浮生是什么意思,乱世浮生,意思是在混乱动荡的社会背景下,人如浮萍般飘荡,比喻人生逢乱世的悲惨...
深天马A近期接受机构调研时表示,长期在车载显示市场的耕耘积累和坚定投入有效支撑了公司车载业务的增长...
本文作者:MagicTan原本想着观众老爷看腻了春节档满球大战,给各位安利一首歌,聊点有的没的。结果八卦...
veromoda是什么牌子, veromoda中文名字维莎曼,是美国著名品牌女装,1987年创立,归属于美...
灵活就业社保补贴申请条件主要有:一、先参保后补贴:想要进行灵活就业社保补贴的申请,那么需要保证自...
中国经济网北京2月13日讯今日,淳厚基金管理有限公司公告称,淳厚优加一年持有混合增聘基金经理薛莉丽。...
新华社北京2月12日电题:坚定文化自信,为乡村振兴塑形铸魂新华社记者周玮、杨湛菲2月12日,由文化和旅...
2月13日上午,省政府新闻办召开河南省“实事惠民生聚力谋出彩”系列第五场新闻发布会,介绍和解读河南省...
以下是熊猫乳品在北京时间2月13日10:59分盘口异动快照:2月13日,熊猫乳品盘中涨幅达5%,截至10点59分,...
近日关于中超深圳队的传闻不断,媒体人王伟发文,谈到了所了解的目前深圳队的情况。王伟在个人社媒中写...
1、冬季水培绿萝最好养殖在20℃左右的环境中,如果低于5℃,植株叶子就会变黄甚至植株枯萎,可以用棉布...
新华社合肥2月11日电制造业一线生产车间高速运转,重大工程作业现场机器轰鸣,车流、物流、人流迎来旺盛...
新华社北京2月11日电(记者许仕豪、丁文娴)羽超联赛时隔两年重燃战火。中国羽毛球协会11日宣布,2023年...
近日,位于德国慕尼黑的德国汽车联合会对部分品牌轮胎的磨损进行了研究评级。在此次测试中,米其林和住...
X 关闭
X 关闭