首页 > 后端开发 > php教程 > 求php一段递归代码的理解

求php一段递归代码的理解

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2016-06-06 20:14:10
原创
1033 人浏览过

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次呢,求高手解答。

回复内容:

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次呢,求高手解答。

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

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

<code> function test()
    {
        static $count = 0;
    
        $count++;
        echo "-- ".$count." --\n";
        if ($count < 2) {
            test();
        }
        $count--;
        echo "## ".$count." ##\n";
    }
</code>
登录后复制

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

<code>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
    }
</code>
登录后复制

3.调用 test()后

<code>test()
</code>
登录后复制

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

<code> 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 ##**
</code>
登录后复制

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

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

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

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

<code>function test()
{
    static $count = 0;

    $count++;

    echo "-- ".$count." --<br/>";
    if ($count < 10) {
        test();
        $count--;
        echo "## ".$count." ##<br/>";
    }

}
test();</code>
登录后复制

@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 ##
登录后复制

相关标签:
php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
怎么学好php
来自于 1970-01-01 08:00:00
0
0
0
PHP扩展intl
来自于 1970-01-01 08:00:00
0
0
0
php数据获取?
来自于 1970-01-01 08:00:00
0
0
0
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板