这个递归函数的运行结果不明白

<?php
function recursion(){
    static $count = 0;
    $count++;
    echo $count."&nbsp;  ";
    if($count < 10){
        recursion();
    }
    echo $count."&nbsp;  ";
    $count--;
}
    recursion();
?>

请问运行结果为何是

1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1

1.为何不是
1 2 3 4 5 6 7 8 9 10 10
2.它的退出条件是什么?

阅读 2.5k
5 个回答

1.因为PHP是同步执行,你满足条件一直递归执行recursion()自然就是相当于一直嵌套,那么同步执行下来自然就是
1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1
你可以把 其中一个 换成其他的就能很直观的看出来了
2.当$count = 10 的时候自然就退出了,不执行递归,所以会有 10 10 出现

递归一层层嵌套,到最后一层$count为10时,停止执行,此时输出为 1 2 3 4 5 6 7 8 9 10,还未输出下方的echo $count."&nbsp; ";
之后开始输出下方的echo,一层层输出,直至最开始的那一层,即$count++后为1的这层:10 9 8 7 6 5 4 3 2 1
程序退出。

你只是进入了if判断,但是函数还没执行完,所以当判断完以后就开始执行函数后面的部分了,if里面的函数也是要执行的,所以会接着输出

我们可以把代码简单化,有助于你理解递归。PHP是顺序执行的,递归可以简单的理解为,将自身代码又复制了一遍。
因为10次太多,我们把他改为3次

<?php
function recursion(){
    static $count = 0;
    $count++;                    //$count = 1;
    echo $count."&nbsp;  ";      //echo 1
    if($count < 3){
        $count++;                //$count = 2
        echo $count."&nbsp;  ";  //echo 2
        if($count < 3){
            $count++;                //$count = 3
            echo $count."&nbsp;  ";  //echo 3
            if($count < 3){          //不成立,所以不重复执行了,开始执行if后面的代码
                //...
            }                        //echo 3
            echo $count."&nbsp;  ";
            $count--;                //$count =2
        }
        echo $count."&nbsp;  ";      //echo 2
        $count--;                    //$count =1
    }
    echo $count."&nbsp;  ";          //echo 1
    $count--;                        //$count =0
}
    recursion();
?>

然后我们把函数体里的调用自身,改成自身的代码。就会发现,很简单,一步一步执行完毕了。

个人觉得把上面的代码改成这样可能更容易理解,如果是逐步分析的话已经有别人提供答案了.不过一般写递归或者分析递归不是用逐步分析的,因为函数的复杂度一上去就不好分析了.

这里有说如何理解递归和使用递归 https://acl.readthedocs.io/en... .
也可以去看 SICP 里面的第一章关于迭代和递归的部分 .

<?php
function recursion($count){
    $count++;
    echo $count." ";
    if($count < 10){
        recursion($count);
    }
    echo $count." ";
    $count--;
}

recursion(0);
?>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题