PHP 递归函数的理解

article/2025/9/22 3:01:30

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

那什么是递归函数呢?

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

好,那下面我们就拿高洛峰老师的《细说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

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


http://chatgpt.dhexx.cn/article/bQumdUM5.shtml

相关文章

PHP中使用递归函数

下面是使用递归函数的一个小例子。 目的是根据parent_id和task_id对task进行分类。 具体实现&#xff1a; <?php //连接数据库&#xff0c;使用前几天创建的数据库连接文件进行连接&#xff0c;如果没有这个文件可以去我的博客里找一下 require_once(./db.php); $conn…

PHP递归详解

递归 递归是一种函数调用自身的机制递归必须要有边界条件&#xff0c;也就是递归出口&#xff08;退出递归&#xff09;递归前进段和递归返回段&#xff0c;也就是最后得到的值当边界条件不满足时&#xff0c;递归前进&#xff1b;当边界条件&#xff08;递归出口&#xff09;…

PHP 递归函数

递归函数即自调用函数&#xff0c;在函数体内部直接或间接的自己调用自己&#xff0c;即函数的嵌套调用就是函数本身。通常 在此类型的函数体中会附加一个条件判断&#xff0c;以判断是否需要执行递归调用&#xff0c;并且在特定的条件下终止函数的递归 调用动作&#xff0c;…

软件设计师考试感想随笔

带着紧张期待的心情查询了2021年下半年的软件设计师考试成绩&#xff0c;上午55分&#xff0c;下午66分&#xff0c;对这个成绩也算预料之中&#xff0c;因为我刚考完不到一个星期就在网上搜了答案对了成绩。 刚开始的时候买的纸质教程&#xff0c;厚厚的一本&#xff0c;还没看…

软考中级,软件设计师考试那些内容,考试大纲什么的?

一、中级软件设计师科目包括&#xff1a; &#xff08;1&#xff09;计算机与软件工程知识&#xff0c;考试时间为150分钟&#xff0c;笔试&#xff0c;选择题&#xff1b; &#xff08;2&#xff09;软件设计&#xff0c;考试时间为150分钟&#xff0c;笔试&#xff0c;问答…

软考软件设计师中级考试大纲(附题型举例)

软件设计师考试大纲 一、考 试 说 明 1&#xff0e;考试目标 通过本考试的合格人员能根据软件开发项目管理和软件工程的要求&#xff0c;按照系统总体设计规格说明书进行软件设计&#xff0c;编写程序设计规格说明书等相应的文档&#xff0c;组织和指导程序员编写、调试程序…

软考中级–软件设计师考试大纲

软考中级–软件设计师考试大纲 考试场数&#xff1a;上午&#xff08;基础理论&#xff0c;75个选择题&#xff0c;1空1分&#xff09;、下午&#xff08;案例分析&#xff0c;五个解答题&#xff0c;每道题15分&#xff09; 分数线&#xff1a; 上下午满分都是75分&#xff…

软件设计师提纲+复习资料整理(上午题)

文章目录 软件设计师考试大纲上午题&#xff08;选择题&#xff09;一、计算机组成原理考点&#xff1a;CPU结构组成考点&#xff1a;原码、反码、补码定点整数范围考点&#xff1a;浮点数表示考点&#xff1a;RISC和CISC计算机的区别考点&#xff1a;奇校验与偶校验考点&#…

【软考-软件设计师精华知识点笔记】考试大纲及题型介绍

前言 今年上半年参加了软件设计师考试&#xff0c;考完感觉稳了&#xff08;成绩下来已经通过了&#xff09;&#xff0c;考试内容与我学习的内容基本一致&#xff0c;因此感觉自己的笔记可以帮助其他准备考试的童鞋。总共十一章的笔记&#xff0c;已完成。如果未来有机会&…

struts2拦截器定义

为什么需要拦截器&#xff1a; 早起MVC框架将一些通用操作写死在核心控制器中&#xff0c;致使框架灵活性不足&#xff0c;可扩展性降低。Struts2将核心功能放在多个拦截器中实现&#xff0c;拦截器可自由选择和组合&#xff0c;增强了灵活性&#xff0c;有利于系统的解耦。 什…

Struts2拦截器-abstractInterceptor

通过继承AbstractInterceptor类&#xff0c;重写intercept方法&#xff0c;实现拦截器&#xff1b; 需要在Struts2中初始化需要放行的action名称 具体流程&#xff1a; 1.新建Struts2项目&#xff08;MyEclipse自动配置Struts2环境&#xff09; 2.新建页面&#xff08;index…

Struts2拦截器-MethodFilterInterceptor

Struts2拦截器-abstractInterceptor--在这篇博文的基础上进行修改&#xff1b; 1.页面1 2.页面2 3.新建实体 4.新建action 5.新建MethodFilterInterceptor拦截器继承MethodFilterInterceptor 6.配置拦截器

Struts2拦截器入门

Struts2的流程图 Struts2的处理流程 Struts2的拦截器中的分离关注 把过滤器要完成的事情委托给多个类完成&#xff0c;这种观点就是分离关注&#xff0c;过滤器负责调用这些类。 处理Cookies的拦截器&#xff08;处理web中的cookies&#xff09;令牌拦截器&#xff08;处理表…

struts2拦截器使用(部分拦截和全局拦截器)

应用场景:在请求处理之前拦截请求&#xff0c;做出相关处理。比如在一个网站中&#xff0c;用户尚未登录那么他是无法查看个人信息界面的。这时候我们就可以使用拦截器来拦截他访问个人信息的界面的请求。具体如下&#xff08;这里主要是struts2自定义拦截器的方法&#xff09;…

Struts 2拦截器

学习内容 拦截器工作原理 Struts 2自带拦截器 自定义拦截器 能力目标 熟悉Struts 2拦截器工作原理 熟练使用和配置拦截器 本章简介 上一章我们深入学习了Struts 2框架的配置&#xff0c;包括Action的配置、Result的配置等等&#xff0c;使我们对Struts 2框架有了更深的了解。…

Struts2拦截器的学习

一.首先我应该先要了解Struts2拦截器的执行原理 Struts 2的拦截器实现相对简单。当请求到达Struts2的ServletDispatcher时&#xff0c;Struts 2会查找配置文件&#xff0c;并根据其配 置实例化相对的拦截器对象&#xff0c;然后串成一个列表&#xff08;list&#xff09;&#…

Struts2拦截器Filter

拦截器 拦截器Filter是Struts2的核心。 Struts2的拦截器与Servlet中的过滤器相似。 在执行Action的execute()方法之前&#xff0c;Struts2先执行struts.xml中引用的拦截器&#xff0c;在执行完所有引用的拦载器的doIntercept()方法后&#xff0c;会执行Action的execute()方法…

struts2拦截器

1. 拦截器 1.1 概述 基本概念 Intercetor, 即为拦截器。 1&#xff09; 在Struts2中&#xff0c;把每一个功能都用一个个的拦截器实现&#xff1b;用户想用struts的哪个功能的时候&#xff0c;可以自由组装使用。 2&#xff09;Struts2中&#xff0c;为了方法用户对拦截器的引…