search

Home  >  Q&A  >  body text

求php一段递归代码的理解

function test()
{
    static $count = 0;

    $count++;
    echo "-- ".$count." --\n";
    if ($count < 10) {
        test();
    }
    $count--;
    echo "## ".$count." ##\n";
}
test();

结果输出如下:

-- 1 --
-- 2 --
-- 3 --
-- 4 --
-- 5 --
-- 6 --
-- 7 --
-- 8 --
-- 9 --
-- 10 --
## 9 ##
## 8 ##
## 7 ##
## 6 ##
## 5 ##
## 4 ##
## 3 ##
## 2 ##
## 1 ##
## 0 ##

我的疑惑是 当$count加到10后就不会再调用自身了,那么它会运行下面的代码$count--然后输出就结束了,可是为什么它还是运行了9次呢,求高手解答。

PHP中文网PHP中文网2897 days ago281

reply all(5)I'll reply

  • 伊谢尔伦

    伊谢尔伦2017-04-10 17:06:51

    这样吧,我们假设让$count小于2时来看看整个执行过程:

    1. 将小于10改为小于2:

     function test()
        {
            static $count = 0;
        
            $count++;
            echo "-- ".$count." --\n";
            if ($count < 2) {
                test();
            }
            $count--;
            echo "## ".$count." ##\n";
        }
    

    2.将小于2时,里面递归的test()换成函数体内的代码:

    function test()
    {
        static $count = 0;   // line 1
        $count++; // line 2
        echo "-- ".$count." --\n"; // line 3
        if ($count < 2) { // line4
            static $count = 0;
            $count++; // line 5
            echo "-- ".$count." --\n";// line 6
            if ($count < 2) {// line 7
                test();
            }
            $count--;// line 8
            echo "## ".$count." ##\n";// line 9
        }
        $count--;// line 10
        echo "## ".$count." ##\n";// line 11
        }
    

    3.调用 test()后

    test()
    

    4.来看整个详细的执行流程:

     4.1 第一次,line 1:$count = 0;
     4.2 执行line 2后,$count = 1;
     4.3 所以在line 3 会输出: **-- 1 --**
     4.4 接着执行line 4,由于现在 $count < 2为真;
     4.5 所以执行 line5后变为2
     4.6 所以 line 6 会输出: **-- 2 --**
     4.7 然后到 line 7,由于 $count = 2,不小于2直接执行line 8
     4.8 line 8 执行后, $count变为1,接着执行line 9
     4.9 在line 9 会输出: **## 1 ##**
     4.10 接着就执行 line 10,$count再减1,就变为0
     4.11 因此在 line 11会输出: **## 0 ##**
    

    5.总结:
    当我们假定 $count小于2时,在上面详细的执行流程中我们看到:
    test()总共被执行了2次,
    输出结果为:
    -- 1 --,-- 2 --,## 1 ##,## 0 ##
    这时候再回头将 $count小于10,就容易解释楼主的疑问了。
    不知道是否帮助到了你。有疑问继续联系。

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 17:06:51

    没有再运行9次呀,test函数只运行了10次。但是每个函数中有两个输出,所以总共输出了20次。

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 17:06:51

    有没有return不会停止,在调用他自己后还会继续执行的

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:06:51

    因为当$count=10的时候,该段代码还是执行了,你可以这样写

    function test()
    {
        static $count = 0;
    
        $count++;
    
        echo "-- ".$count." --<br/>";
        if ($count < 10) {
            test();
            $count--;
            echo "## ".$count." ##<br/>";
        }
    
    }
    test();

    reply
    0
  • 迷茫

    迷茫2017-04-10 17:06:51

    @phping 这是我对于刚才递归的理解,和你的类似。

    function test() {
        static $count = 0; // 初始化静态变量$count
        $count++; // $count = 1;
        echo "-- ".$count." --\n"; // 输出 1
        if($count < 3) { // 1 小于 3 为真
            static $count = 0; // 初始
            $count++; // $count = 2;
            echo "-- ".$count." --\n"; // 输出 2
            if($count < 3) { // 2 小于 3 为真
                static $count = 0; // 初始
                $count++; // $count = 3
                echo "-- ".$count." --\n"; // 输出 3
                if($count < 3) {} // 3 不小于 3 为假
                $count--; // $count = 2;
                echo "## ".$count." ##\n"; // 减后输出 2
            }
            $count--; // $count = 1
            echo "## ".$count." ##\n"; // 减后输出 1
        }
        $count--; // $count = 0;
        echo "## ".$count." ##\n"; // 减后输出 0
    }
    test();

    最后输出

    -- 1 --
    -- 2 --
    -- 3 --
    ## 2 ##
    ## 1 ##
    ## 0 ##

    reply
    0
  • Cancelreply