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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
php获取某个目录大小的代码
Sep 10 PHP
PHP 小心urldecode引发的SQL注入漏洞
Oct 27 PHP
php session劫持和防范的方法
Nov 12 PHP
php对数组排序的简单实例
Dec 25 PHP
使用openssl实现rsa非对称加密算法示例
Jan 24 PHP
php获得url参数中具有&amp;的值的方法
Mar 05 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
微信access_token的获取开发示例
Apr 16 PHP
joomla数据库操作示例代码
Jan 06 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
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
相对路径转化成绝对路径
2007/04/10 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
python 提取文件的小程序
2009/07/29 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
canvas实现有递增动画的环形进度条的实现方法
2019/07/10 HTML / CSS
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
数控技术与应用毕业生自荐信
2013/09/24 职场文书
文秘人员工作职责
2014/01/31 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
跑操口号
2014/06/12 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
婚育证明样本
2015/06/16 职场文书
英镑符号 £
2022/02/17 杂记
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技