很多同学在学习递归函数的时候会感到头晕,无法搞清楚递归函数的原理和运行机制,本文将给大家详细讲解递归函数的运行机制和运用。

那什么是递归函数呢?

递归函数即为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行,可能这样给大家讲解,还是很难明白。

好,那下面我们就拿高洛峰老师的《细说PHP》中的例子来给大家讲解。

<?phpfunction test($n){echo $n . "  ";if ($n > 0) {test($n - 1);} else {echo "<-->";}echo $n . "  ";}test(10);
?>

大家首先思考一下,这个例子最终的输出结果是什么?

好,我们来看一下本函数输出的结果:

10 9 8 7 6 5 4 3 2 1 0 <--> 0 1 2 3 4 5 6 7 8 9 10

怎么样,不知道这个结果是否跟大家设想的一样呢?

好,下面我一步一步来给大家讲解...

第一步,执行test(10),echo 10,然后因为10>0,执行test(9),后面还有没来得及执行的echo 10

第二步,执行test(9),echo 9,然后因为9>0,执行test(8),同样后面还有没来得及执行的 echo 9

第三步,执行test(8),echo 8,然后因为8>0,执行test(7),同样后面还有没来得及执行的 echo 8

第四步,执行test(7),echo 7,然后因为7>0,执行test(6),同样后面还有没来得及执行的 echo 7

第五步,执行test(6),echo 6,然后因为6>0,执行test(5),同样后面还有没来得及执行的 echo 6

...........

第十步,执行test(0),echo 0,此时0>0的条件不满足,不在执行test()函数,而是echo “<-->”,并且执行后面的 echo 0

10 9 8 7 6 5 4 3 2 1 0 <--> 0 1 2 3 4 5 6 7 8 9 10

此时,输出的内容如上述显示的红色部分,此时函数已经不再调用自己,开始将流程的主控权交回给上一层函数来执行

也就是开始执行刚刚所有test()函数没来得及输出的最后一个echo

它的流程是这样子的:

在函数执行的第一到第十步,函数输出的的是绿色部分红色部分还“没来及”输出,就该调用自己执行操作,依次类推,直到流程执行到不再满足调用自己的条件,输出“<-->”,此时,流程该执行前面“没来及”输出的代码。

就像我们平时玩的游戏一样,打死一个怪物,掉出一个宝贝,但是还有其他怪物在等着你来消灭,你不得不消灭完所有的怪物才能回来一个一个地拾宝贝。

怎么样,这么样跟大家来讲解是不是明白了呢? 
有的同学又会问了,我在执行完所有的test函数之后,最终输出0

也就是输出到这里,

10 9 8 7 6 5 4 3 2 1 0 <--> 0

那为什么下一个输出的是 ,而不是 10 呢,

对于这个问题,为了帮助大家理解,下面我再给大家举一个例子:

看如下代码:

<?phpfunction one($num){echo $num;two($num - 1);echo $num;}function two($num){echo $num;three($num - 1);echo $num;}function three($num){echo $num;}one(3);
?>

以上代码对test()函数进行分解操作,我们思考:

执行one(3)函数的时候,同test()函数一样,首先要输出3,然后调用two(2)函数,

注意,此时还没有输出下面的3,

接着走,执行two(2)函数,输出2,调用three(1)函数,同样,这里没有来得及输出下面的2,

执行three(1),直接输出1,不在调用其它函数,

此时,我们想刚刚的two()函数是不是还没有执行完,好,接着执行two()函数没有完成的部分,two()函数执行完之后,也就是输出下面的2,然后开始执行one()函数没有执行完的部分,也就是输出下面的3,此时所有函数执行完毕。

那么,输出结果是:

3 2 1 2 3

怎么样,大家这样理解起来是不是会容易些呢?

PHP 递归函数的理解相关推荐

  1. 递归函数的理解 (三种类型)

    函数的递归调用 递归问题是一个说简单也简单,说难也有点难理解的问题.我想非常有必要对其做一个总结. 首先理解一下递归的定义,递归就是直接或间接的调用自身.而至于什么时候要用到递归,递归和非递归又有那些 ...

  2. Python中 递归函数 的理解

    2022.4.3 此文章重度参考以下文章 递归函数的讲解 递归函数深入浅出 递归函数再讲 重新思考递归函数 首先一定要明确: 递归函数的定义 : 自己调用自己的函数就是递归 递: 去 归: 回 一去一 ...

  3. python3 递归函数的理解

    1.递归的定义 一个函数直接或者间接调用自己,那么这个函数就称为递归函数. 那这个函数如果一直自己调用自己,是不是会一直处于死循环状态,答案是不会,因为python为了杜绝此类现象,强制的将递归层数控 ...

  4. python递归函数特点_python中对递归函数的理解

    在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 * 2 * 3 * ... * n,用函数fact(n)表示,可以看出: f ...

  5. php递归函数的理解

    递归函数其实就是自己再调用自己,直到条件终止的时候结束 主要还是来剖析一下这个递归函数的执行过程吧 1.首先代码的执行顺序是从上往下,从左往右的顺序. 首先拿到代码不能被自己的思维所带进坑(想象一下你 ...

  6. 关于递归函数基本理解,我有话想对你说

    什么是递归函数? 在编程的世界里,递归就是一种调用自己的手段 递归函数:一个函数的内部,调用了自己,循环往复. 其实递归函数和循环很类似. 要实现递归要书写2个内容: 1,一个满足结束条件的结束函数 ...

  7. C语言学习总结(1)-递归函数的理解

    啥是递归? 即是该函数调用它本身自己,这种调用过程称为递归. 递归可以相当于循环,所以想结束递归,就必须有终止递归的条件测试部分,否则就会出现无限递归(即无限循环).同时,这也是使用递归的难点. 案例 ...

  8. 2014递归求解单链表中的平均值(C++,附递归函数思路讲解)

    描述 利用单链表表示一个整数序列,利用递归的方法计算单链表中各个结点的平均值. 输入 多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔).当n=0时输入结束. ...

  9. python中递归函数的基例_详谈Python基础之内置函数和递归 Python递归和循环的区别...

    Python 递归函数基例 2. 关于递归函数基例的说明,以下选项中错误的是 A 递归函数的基例决定所谓基例就是不需要递归就能求解的,一般来说是问题的最小规模下的解. 例如:斐波那契数列递归,f(n) ...

最新文章

  1. java 解释型和编译型
  2. Linux 高可用(HA)集群之keepalived详解
  3. 【译】Easily Build Android APKs on Device in Termux
  4. RTT设备与驱动之PIN设备
  5. 《算法竞赛入门经典》习题3-1 得分(Score,ACM、ICPC Seoul 2005,UVa1585)
  6. Android 缓存机制
  7. 投票选举c语言程序,C语言元旦礼物:经典入门问题分析——选举投票
  8. docker安装linux安装mysql_怎么启动mysql-linux 怎么安装mysql?怎么在docker搭建mysql8?docker安装mysql...
  9. arm linux装wine,Ubuntu下安装wine详细介绍
  10. 客户组网服务案列_信息报道丨云浮支撑服务中心2020年第五期
  11. Projective Dynamics: Fusing Constraint Projections for Fast Simulation
  12. 7内置数据结构_dict
  13. php宿舍管理系统毕业论文,学生宿舍管理系统(源码+论文)
  14. awr报告 解读_最详尽的AWR报告详细分析
  15. 通讯录管理软件Cardhop for Mac
  16. vue点击按钮跳转页面
  17. CollectionUtils取交集,并集和差集
  18. postfix邮件服务器迁移,记一次搭建Postfix邮件服务器(上篇)
  19. 判断三条边能否构成三角形 python
  20. javax.servlet.Filter详解(二) 转自:http://hi.baidu.com/jxnuywf/blog/item/f3834aee93e2fdf8b2fb95cc.html

热门文章

  1. 如何使用Qt绘制时间刻度轴
  2. 问世到现在电子计算机的性能,一级计算机练习.doc
  3. linux程序提示killed的原因
  4. Windows电脑开机蓝屏(2)
  5. 解决surface的幽灵触控
  6. *皮亚诺关于公理4的一段语录解析 皮亚诺读后之六
  7. TestProject 自动化
  8. 特征选择(一)-维数问题与类内距离
  9. Web性能压力测试工具-Webbench
  10. [css] scale