搜尋

首頁  >  問答  >  主體

php函數,結果很意外

雷雷
黄舟黄舟2740 天前779

全部回覆(7)我來回復

  • 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

    回覆
    0
  • 伊谢尔伦

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

    遞歸返回的時候,這句話就會倒著輸出

    回覆
    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 也是這樣的邏輯

    回覆
    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

    回覆
    0
  • 某草草

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

    可以參考下這篇文章,了解遞迴也就清楚了。 http://www.jianshu.com/p/8bee...

    回覆
    0
  • 天蓬老师

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

    你可以這樣想, 這個函數起作用的就是前半部echo了i,後半部echo了i,中間插了個調用自身直到i=5,相當於echo i直到5,再倒回來echo直到最開始的值..就這個進到出的關係搞好就行.

    回覆
    0
  • 仅有的幸福

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

    謝謝各位,我明白了

    回覆
    0
  • 取消回覆