PHP实现递归的三种方法
递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去。实现递归函数可以采取什么方式呢?本文列出了三种基本方式。理解其原来需要一定的基础知识水品,包括对全局变量,引用,静态变量的理解,也需对他们的作用范围有所理解。递归函数也是解决无限级分类的一个很好地技巧。
利用引用做参数
先不管引用做不做参数,必须先明白引用到底是什么?引用不过是指两个不同名的变量指向同一块存储地址。本来每个变量有各自的存储地址,赋值删除各行其道。现在可好,两个变量共享一块存储地址。 $a=&$b; 。实际上指的是 $a 不管不顾自己原来的存储地址,非要和 $b 共享一室了。因而任何对存储地址数值的改变都会影响两个值。
函数之间本来也是各行其是,即便是同名函数。递归函数是考虑将引用作为参数,成为一个桥梁,形成两个函数间的数据共享。虽然两个函数见貌似操作的是不同地址,但是实际上操作的是一块儿内存地址。
<?php function deeploop(&$i=1){ echo $i; $i++; if ($i<10) { deeploop($i); }} deeploop();
利用全局变量
利用全局变量完成递归函数,请确保你确实理解什么是全局变量。global在函数内申明变量不过是外部变量的同名引用。变量的作用范围仍然在本函数范围内。改变这些变量的值,外部同名变量的值自然也改变了。但一旦用了&,同名变量不再是同名引用。利用全局变量实现递归函数没必要理解到这么深的一层,还保持原有对全局变量的看法就可以顺理成章理解递归函数。
<?php$i = 1;function deeploop(){ global $i; echo $i; $i++; if ($i<10) { deeploop(); }} deeploop();
利用静态变量
我们常常在类中见到static,今天我们把它利用到递归函数中。请记住static的作用:仅在第一次调用函数的时候对变量进行初始化,并且保留变量值。
<?php function deeploop(){ static $i=1; echo $i; $i++; if ($i<10) { deeploop(); }} deeploop();
首先第一次调用deeploop(),static对 $i 进行初始化,其后每一次执行完都会保留 $i 的值,不再进行初始化,相当于直接忽略了 static $i =1; 这一句。
PHP实现递归的三种方法相关推荐
- 求C n m(从n个数中选m个数,有多少种组合?问题)暴力—递归——回归数学公式,三种方法,层层优化!
文章将以代码+解析(简单)的方式进行,欢迎大家的阅读! 首先,任何一个问题都是有来源的,所以请先看题(我遇到的): 暴力解法(我第一次的想法) 代码如下: #include <stdio.h&g ...
- 三种方法求递归算法的时间复杂度(递推,master定理,递归树)
三种方法: 递推方法求递归算法的时间复杂性 Master定理方法求递归算法时间复杂性 递归树求解递归方程 1.递推方法求递归算法的时间复杂度 我们先来看一个经典的案例,汉诺塔问题 汉诺塔(Hanoi ...
- 在JavaScript中重复字符串的三种方法
In this article, I'll explain how to solve freeCodeCamp's "Repeat a string repeat a string" ...
- 算法导论中求解时间复杂度的三种方法
这一章讲的是递归式(recurrence),递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的. 本章讲了三种方法来解递归式,分别是代换法,递归树方法,主方法. 1.代换法( ...
- PHP中删除目录的三种方法
原文链接:http://www.chinaz.com/program/2008/1022/41645.shtml PHP中删除目录的三种方法 1.递规法:利用递归一层一层的删. deleteDir($ ...
- js实现阶乘算法的三种方法
js实现阶乘算法的三种方法 // 非递归写法 function f(n) {if (0 === n) {return 1;}let res = 1;for (let i = 1; i <= n; ...
- 在JavaScript中反转字符串的三种方法
This article is based on Free Code Camp Basic Algorithm Scripting "Reverse a String" 本文基于F ...
- php 快速排序函数,PHP实现快速排序算法的三种方法
摘要:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序 ...
- Xslt取节点集的指定位置记录的三种方法
如果我们在一个Xml中有N个子结点,我们希望取得其中的指定位置的节点,我们应该怎么做呢?我们有三种方法可以实现这个功能. Xml如下: <?xml version="1.0" ...
最新文章
- 阿里云发布大数据产品ODPS 6小时处理100PB数据
- JQuery学习系列(九)AJAX
- iBatis.Net系列(一)-简介
- mysql存储过程while 遍历游标
- 阿里P7大牛亲自教你!BAT这种大厂履历意味着什么?积累总结
- Android中的Handler, Looper, MessageQueue和Thread
- 在 js 中怎样获得 checkbox 里选中的多个值?(jQuery)
- 火山去水印链接_在线批量去水印下载快手图集视频、抖音、火山等平台方法技巧!...
- C++工作笔记-使用namespace构建常量头文件
- HTML页面打印功能js代码,JavaScript_js实现页面打印功能实例代码(附去页眉页脚功能代码),复制代码 代码如下: html - phpStudy...
- 负载均衡的原理和架构
- 全局角度出发讨论敏捷
- 新版男神女神完整投票系统源码V5.5.21版本
- python 随机森林调参_scikit-learn随机森林调参小结
- 【WPS自动签到】利用云函数实现WPS自动签到获得WPS免费会员
- 查询数据库重复记录方法
- 毕业论文的流程图怎么画
- RSA加密学习的简单例子
- VS2012 BIDS之Reporting Service/SSRS 项目
- 2018的穿肠毒药和2019的心灵鸡汤
热门文章
- 【Auto.js】为任何指定QQ好友点赞
- [网络]_获取内外网IP地址【Auto.js】
- django-celery使用
- 4028: [HEOI2015]公约数数列
- Win10 UWP开发中的重复性静态UI绘制小技巧 1
- 51nod 1277 KMP 前缀出现次数
- 设计模式之职责链模式
- UINavgationController中覆写preferredStatusBarStyle方法不执行的问题
- Android教程-Java基础2 语法与关系运算
- java怎么获取字符串位置,Java:在字符串中获取匹配位置的方法?