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 相关文章推荐
elgg 获取文件图标地址的方法
Mar 20 PHP
php 数组的指针操作实现代码
Feb 08 PHP
PHP分多步骤填写发布信息的简单方法实例代码
Sep 23 PHP
php页面消耗内存过大的处理办法
Mar 18 PHP
$_GET['goods_id']+0 的使用详解
Jun 06 PHP
PHP实现财务审核通过后返现金额到客户的功能
Jul 04 PHP
因str_replace导致的注入问题总结
Aug 08 PHP
Yii框架实现对数据库的CURD操作示例
Sep 03 PHP
解决php扩展安装不生效问题
Oct 25 PHP
php的无刷新操作实现方法分析
Feb 28 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
XAMPP升级PHP版本实现步骤解析
Sep 04 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
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
php获取淘宝分类id示例
2014/01/16 PHP
php动态绑定变量的用法
2015/06/16 PHP
Yii使用技巧大汇总
2015/12/29 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
关于js datetime的那点事
2011/11/15 Javascript
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
jquery获取radio值实例
2014/10/16 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
使用Python的PEAK来适配协议的教程
2015/04/14 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
Python 控制终端输出文字的实例
2019/07/12 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
Python 如何展开嵌套的序列
2020/08/01 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
Ajax和javascript的区别
2013/07/20 面试题
有针对性的求职自荐信
2013/11/14 职场文书
工作求职信
2014/07/04 职场文书
预备党员群众意见
2015/06/01 职场文书
催款函范本大全
2015/06/24 职场文书
2015年依法治校工作总结
2015/07/27 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL