递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去。实现递归函数可以采取什么方式呢?本文列出了三种基本方式。理解其原来需要一定的基础知识水品,包括对全局变量,引用,静态变量的理解,也需对他们的作用范围有所理解。递归函数也是解决无限级分类的一个很好地技巧。

利用引用做参数

  先不管引用做不做参数,必须先明白引用到底是什么?引用不过是指两个不同名的变量指向同一块存储地址。本来每个变量有各自的存储地址,赋值删除各行其道。现在可好,两个变量共享一块存储地址。 $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实现递归的三种方法相关推荐

  1. 求C n m(从n个数中选m个数,有多少种组合?问题)暴力—递归——回归数学公式,三种方法,层层优化!

    文章将以代码+解析(简单)的方式进行,欢迎大家的阅读! 首先,任何一个问题都是有来源的,所以请先看题(我遇到的): 暴力解法(我第一次的想法) 代码如下: #include <stdio.h&g ...

  2. 三种方法求递归算法的时间复杂度(递推,master定理,递归树)

    三种方法: 递推方法求递归算法的时间复杂性 Master定理方法求递归算法时间复杂性 递归树求解递归方程 1.递推方法求递归算法的时间复杂度 我们先来看一个经典的案例,汉诺塔问题 汉诺塔(Hanoi ...

  3. 在JavaScript中重复字符串的三种方法

    In this article, I'll explain how to solve freeCodeCamp's "Repeat a string repeat a string" ...

  4. 算法导论中求解时间复杂度的三种方法

    这一章讲的是递归式(recurrence),递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的. 本章讲了三种方法来解递归式,分别是代换法,递归树方法,主方法. 1.代换法( ...

  5. PHP中删除目录的三种方法

    原文链接:http://www.chinaz.com/program/2008/1022/41645.shtml PHP中删除目录的三种方法 1.递规法:利用递归一层一层的删. deleteDir($ ...

  6. js实现阶乘算法的三种方法

    js实现阶乘算法的三种方法 // 非递归写法 function f(n) {if (0 === n) {return 1;}let res = 1;for (let i = 1; i <= n; ...

  7. 在JavaScript中反转字符串的三种方法

    This article is based on Free Code Camp Basic Algorithm Scripting "Reverse a String" 本文基于F ...

  8. php 快速排序函数,PHP实现快速排序算法的三种方法

    摘要:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序 ...

  9. Xslt取节点集的指定位置记录的三种方法

    如果我们在一个Xml中有N个子结点,我们希望取得其中的指定位置的节点,我们应该怎么做呢?我们有三种方法可以实现这个功能. Xml如下: <?xml version="1.0" ...

最新文章

  1. 阿里云发布大数据产品ODPS 6小时处理100PB数据
  2. JQuery学习系列(九)AJAX
  3. iBatis.Net系列(一)-简介
  4. mysql存储过程while 遍历游标
  5. 阿里P7大牛亲自教你!BAT这种大厂履历意味着什么?积累总结
  6. Android中的Handler, Looper, MessageQueue和Thread
  7. 在 js 中怎样获得 checkbox 里选中的多个值?(jQuery)
  8. 火山去水印链接_在线批量去水印下载快手图集视频、抖音、火山等平台方法技巧!...
  9. C++工作笔记-使用namespace构建常量头文件
  10. HTML页面打印功能js代码,JavaScript_js实现页面打印功能实例代码(附去页眉页脚功能代码),复制代码 代码如下: html - phpStudy...
  11. 负载均衡的原理和架构
  12. 全局角度出发讨论敏捷
  13. 新版男神女神完整投票系统源码V5.5.21版本
  14. python 随机森林调参_scikit-learn随机森林调参小结
  15. 【WPS自动签到】利用云函数实现WPS自动签到获得WPS免费会员
  16. 查询数据库重复记录方法
  17. 毕业论文的流程图怎么画
  18. RSA加密学习的简单例子
  19. VS2012 BIDS之Reporting Service/SSRS 项目
  20. 2018的穿肠毒药和2019的心灵鸡汤

热门文章

  1. 【Auto.js】为任何指定QQ好友点赞
  2. [网络]_获取内外网IP地址【Auto.js】
  3. django-celery使用
  4. 4028: [HEOI2015]公约数数列
  5. Win10 UWP开发中的重复性静态UI绘制小技巧 1
  6. 51nod 1277 KMP 前缀出现次数
  7. 设计模式之职责链模式
  8. UINavgationController中覆写preferredStatusBarStyle方法不执行的问题
  9. Android教程-Java基础2 语法与关系运算
  10. java怎么获取字符串位置,Java:在字符串中获取匹配位置的方法?