php递归函数三种实现方法及如何实现数字累加


Posted in PHP onAugust 07, 2015

      递归函数在编程中是比较常用的一类函数,其特点是函数自身可以调用自身,但是必须在调用自身前有条件判断,否则会导致无限调用下去。本文列出了三种递归函数实现方法,第一种利用引用做参数,第二种利用全局变量,第三种利用静态变量,理解此类问题需要有点基础,包括对全局变量,引用,静态变量的理解,也需对他们的作用范围有所理解。在这不废话了,具体介绍请看下文。

第一种方法:利用引用做参数

先不管引用做不做参数,必须先明白引用到底是什么?引用不过是指两个不同名的变量指向同一块存储地址。本来每个变量有各自的存储地址,赋值删除各行其道。

现在可好,两个变量共享一块存储地址。 $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。为什么呢?因为函数还没执行echo a前就进行了下一次的函数递归。

        真正执行echo a是当a<10条件不满足的时候,echo a,返回result,对于上一层而言,执行完递归函数,开始执行本层的echo $a,依次类推。

第二种方法:利用全局变量

利用全局变量完成递归函数,请确保你确实理解什么是全局变量。global在函数内申明变量不过是外部变量的同名引用。变量的作用范围仍然在本函数范围内。改变这些变量的值,外部同名变量的值自然也改变了。但一旦用了&,同名变量不再是同名引用。利用全局变量实现递归函数没必要理解到这么深的一层,还保持原有对全局变量的看法就可以顺理成章理解递归函数。

function test($a=0,$result=array()){

    global $result;

    $a++;

    if ($a<10) {

        $result[]=$a;

        test($a,$result);

    }

    return $result;

}

第三种方法:利用静态变量

我们常常在类中见到static,今天我们把它利用到递归函数中。请记住static的作用:仅在第一次调用函数的时候对变量进行初始化,并且保留变量值。

举个栗子:

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使用递归函数实现数字累加的方法。

代码如下所示:

<?php

function summation ($count) {

   if ($count != 0) :

     return $count + summation($count-1);

   endif;

}

$sum = summation(10);

print "Summation = $sum";

?>

         面对php递归函数,不必要伤脑筋,深入的理解变量引用相关知识对解决此类问题很有帮助,以上内容就是php递归函数三种实现方法及如何实现数字累加的全部内容,希望对大家今后的学习有所帮助。

PHP 相关文章推荐
php中定义网站根目录的常用方法
Aug 08 PHP
php数据库密码的找回的步骤
Jan 12 PHP
PHP提取字符串中的图片地址[正则表达式]
Nov 12 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
Jun 20 PHP
解析PHP中的unset究竟会不会释放内存
Jul 18 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
phpstorm编辑器乱码问题解决
Dec 01 PHP
php查询ip所在地的方法
Dec 05 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
PHP实现二维数组中的查找算法小结
Jun 09 PHP
PHP中“=&gt;
Mar 01 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
PHP下载生成的csv文件及问题总结
Aug 06 #PHP
PHP获取一年有几周以及每周开始日期和结束日期
Aug 06 #PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 #PHP
php实现无限级分类(递归方法)
Aug 06 #PHP
PHP常用的排序和查找算法
Aug 06 #PHP
PHP处理会话函数大总结
Aug 05 #PHP
PHP实现合并discuz用户
Aug 05 #PHP
You might like
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
2008/09/10 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
PHP缓存集成库phpFastCache用法
2014/12/15 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
Javascript模板技术
2007/04/27 Javascript
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
python实现同时给多个变量赋值的方法
2015/04/30 Python
python实现批量图片格式转换
2020/06/16 Python
Python3多线程基础知识点
2019/02/19 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
简单说下OSPF的操作过程
2014/08/13 面试题
大学生职业生涯规划范文
2014/01/08 职场文书
海飞丝的广告词
2014/03/20 职场文书
情人节寄语大全
2014/04/11 职场文书
家属联谊会致辞
2015/07/31 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书