suchen

Heim  >  Fragen und Antworten  >  Hauptteil

PHP-Funktion, das Ergebnis ist unerwartet

<?php
function fun($i) {
    $i++;
    echo $i;
    if ($i<5) {
        fun($i);
    }
    echo $i;
}
fun(1);
我以为结果会是:23455,实际上是23455432,请问这个432是什么情况?
黄舟黄舟2740 Tage vor780

Antworte allen(7)Ich werde antworten

  • PHPz

    PHPz2017-05-24 11:36:32

    函数的实现功能方面考虑,而不考虑回调过程来理解递归.
    如果考虑回调过程来理解递归的话,就要分析整个递归过程中的参数和变量,还要记住什么时候被调用函数调用返回到主调用函数,就显得有些麻烦.
    对于一些常用的递归函数功能很好描述,如递归求解阶乘:

    <?php
    
    function factorial($n) {
        if ($n != 1)
            $res = $n * factorial($n-1);
        else
            $res = 1;
        return $res;
    }
    
    ?>

    函数功能就是: 计算 n 的阶乘, 函数功能实现就是: n 的阶乘 = n * (n-1)的阶乘.这样理解就不用考虑递归过程中的函数调用问题.

    对于题主的函数:
    函数功能就是: 输入 n,输出 n+1, 如果 n+1<5,执行 fun(n+1),再输出 n+1(不好用一个简短的句子描述):
    所以根据功能描述,可以得到函数的执行过程,最后得到结果.

    1. 执行 fun(1): 输入 1, 输出 2, 2+1<5,执行 fun(2),得到 fun(2) 输出的结果,再输出 2.
      最终输出: 2[输出(fun(2))]2

    2. 同样,fun(2)输出结果: 3[输出(fun(3))]3
      最终输出:23[输出(fun(3))]32

    3. 同样,fun(3)输出结果: 4[输出(fun(4))]4
      最终输出:234[输出(fun(4))]432

    4. 执行fun(4): 由于 4+1<5 判断失败, 不执行 fun(5),输出结果: 55
      最终输出:23455432

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-24 11:36:32

    递归返回的时候,这句话就会倒着输出

    Antwort
    0
  • 为情所困

    为情所困2017-05-24 11:36:32

    函數是沒有異步
    所以你執行fun(1)
    2 $i++; echo $i;
    3 回調func(2) $i++; echo $i;
    4 回調func(3) $i++; echo $i;
    5 回調func(4) $i++; echo $i;
    5 回調func(4) 因為$i++之後,已經大於5所以執行下面的echo $i(fun(4)最底下的echo $i,此時fun(4)整個函數執行結束)
    4 由於func(4)執行完成,所以會繼續執行fun(3) 最底下的echo $i
    3 2 也是這樣的邏輯

    Antwort
    0
  • 世界只因有你

    世界只因有你2017-05-24 11:36:32

    fun函数递归时,在判断$i < 5满足时,会调用自身,此时入栈,同时留下了函数的最后一句echo $i没有执行;当递归调用到$i = 5;此时开始返回到函数上一个栈点,继续执行。即执行函数中的最后一句echo $i;
    所以输出4,然后返回上次入栈的地方,继续输出3 ....直到fun函数完全返回。改为
    if ($i < 5) { return fun($i);}将会输出23455

    Antwort
    0
  • 某草草

    某草草2017-05-24 11:36:32

    可以参考下这篇文章,理解了递归也就清楚了。http://www.jianshu.com/p/8bee...

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-05-24 11:36:32

    你可以这样想, 这个函数起作用的就是前半部分echo了i,后半部分echo了i,中间插了个调用自身直到i=5,相当于echo i直到5,再倒回来echo直到最开始的值..就这个进到出的关系搞好就行.

    Antwort
    0
  • 仅有的幸福

    仅有的幸福2017-05-24 11:36:32

    谢谢各位,我明白了

    Antwort
    0
  • StornierenAntwort