PHP递归函数

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

那什么是递归函数呢?

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

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

复制代码
<?php
function 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

它的流程是这样子的:

Paste_Image.png

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

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

怎么样,这么样跟大家来讲解是不是明白了呢?

有的同学又会问了,我在执行完所有的test函数之后,最终输出0

也就是输出到这里,

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


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

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

看如下代码:

复制代码
<?php
function 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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容

  • 无限分类的两种常用方式 递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判...
    yichen_china阅读 402评论 0 2
  • 递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,...
    大表哥的茶壶阅读 1,082评论 1 0
  • 递归函数 所谓的函数递归调用,就是函数可以在其声明的执行叙述之中调用执行自己。通常在此类型的函数之中会附加一个条件...
    曹渊说创业阅读 594评论 0 2
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,702评论 0 11
  • [if !supportLists]1.[endif]PHP基础(变量的八种类型、empty和isset、null...
    4e855d444c9f阅读 572评论 0 0