设为首页 收藏本站
查看: 616|回复: 0

[经验分享] [转]php递归示例

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-30 11:16:48 | 显示全部楼层 |阅读模式
  <?php
  Function Test() {
static $count = 0; //静态变量只在首次调用时初始化,并被保持直到脚本运行结束
     
     $count++;
echo $count;
if($count < 10){
    Test();
}
     $count--;//返回的时候静态变量清零
}
  ?>
  <?php
  //test() 与 test1() 等价
Function Test() {
static $count = 0;
$count++;
echo $count;
if($count < 3){
Test();
}
$count--;
}

Function Test1() {
//------------1 begin---------------
static $count = 0;
$count++;
echo $count; //1
if($count < 3){
//------------2 begin---------------
static $count = 0;
$count++;
echo $count; //2
if($count < 3){
//------------3 begin---------------
static $count = 0;
$count++;
echo $count; //3
if($count < 3){
    echo "这里不可能执行.";
}
$count--;
//------------3 end---------------
}
$count--;
//------------2 end---------------
}
$count--;
//------------1 end---------------
}
?>
  --------------------------------------递归说明----------------------------------------
  1.递归函数调用其实和普通的函数调用没什么区别,只不过每次call的是同一个函数而已。
  2.递归的本质。递归是一段程序的代码反复效用,把程序的参数等变量保存在一个堆栈里,直到到了边界条件以后再层层返回,将堆栈中的数据弹出计算,最后得到结果
  3.递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用。
  4.理论上,递归和循环是等价的。
所有的递归都可以转化为循环,所有的循环都可以转化为递归。

其实,求值递归的意义不大。
递归求值最终都可以用数据归纳法总结出来一个终极公式。连循环形式都不用,一个公式直接出结果。

递归和循环之间的桥接器是尾递归。
我们知道,循环 = 尾递归
所有的递归都可以转化成尾递归(即循环),区别在于转化的代价是多大,好处是多大。

递归的形式有两种,线性递归和树型递归。
线性递归就是函数只调用自己一次。树型递归则是函数调用自己多次。比如楼主的例子,就是树型递归。
不过,树型递归都是可以线性化的,毕竟,运行栈本身就是线性的(一个数组)。
这要看后面的循环步骤(或者下面层次的递归)需要多少层前面的结果。这个层数就是递归转化为循环(尾递归)的代价。比如,楼主的例子,层数就是 3。这时候,转化为循环,就是值得的。

在极端情况下,循环步骤(或者下面层次的递归)需要前面所有层的结果,这个时候,递归转化为循环,就毫无意义。
这通常是遍历的情况。比如,树结构的深度优先遍历。这时候,循环和递归没有什么区别。循环的形式还更难看,还需要自己维护一个不断伸缩的运行栈。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-106266-1-1.html 上篇帖子: php获取图片信息 下篇帖子: 取消php和phpMyAdmin上传最大2M文件限制 转
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表