php的递归函数

递归函数,在函数内调用自己的函数。但是需要设置退出条件,要不就会无限调用循环下去。看了定义,好像递归函数很容易理解,其实并不然。
不行,你猜一下这段代码会输出什么?

function recursion($n)
{
    echo $n . " ";
    if ($n > 0) {
        recursion($n - 1);
    } else {
        echo "<-->";
    }
    echo $n . " ";
}
recursion(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呢,

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

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

本文转载自
https://www.jianshu.com/p/8bee55ed8c24

Leave a Reply

Your email address will not be published. Required fields are marked *