递归函数即为自调用函数,在函数体内直接或间接本身调用本身,但须要设置自调用的条件,若知足条件,则调用函数自己,若不知足则终止本函数的自调用,而后把目前流程的主控权交回给上一层函数来执行,可能这样给你们讲解,仍是很难明白。 好,那下面咱们就拿高洛峰老师的《细说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 它的流程是这样子的: 在函数执行的第一到第十步,函数输出的的是绿色部分,红色部分还“没来及”输出,就该调用本身执行操做,依次类推,直到流程执行到再也不知足调用本身的条件,输出“<-->”,此时,流程该执行前面“没来及”输出的代码。 就像咱们平时玩的游戏同样,打死一个怪物,掉出一个宝贝,可是还有其余怪物在等着你来消灭,你不得不消灭完全部的怪物才能回来一个一个地拾宝贝。 怎么样,这么样跟你们来说解是否是明白了呢? 有的同窗又会问了,我在执行完全部的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 怎么样,你们这样理解起来是否是会容易些呢? 若是仍是不太明白,请在下边跟帖提问,也请给出宝贵建议,我将会作出相应改进和讲解。