recherche

Maison  >  Questions et réponses  >  le corps du texte

fonction php, le résultat est inattendu

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

répondre à tous(7)je répondrai

  • PHPz

    PHPz2017-05-24 11:36:32

    Comprenez la récursivité en considérant la fonction d'implémentation de la fonction sans considérer le processus de rappel
    Si vous considérez le processus de rappel pour comprendre la récursivité, vous devez analyser les paramètres et les variables dans l'ensemble du processus récursif et vous rappeler quand ils sont appelés. Il est un peu gênant d'appeler une fonction et de revenir à la fonction appelante principale.
    Les fonctions de certaines fonctions récursives couramment utilisées sont bien décrites, telles que Résolution factorielle récursive :递归求解阶乘:

    <?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) rrreee
      La fonction est : Calculer la factorielle de n L'implémentation de la fonction est : La factorielle de n = la factorielle de n * (n-1). De cette façon, il n'est pas nécessaire de considérer le processus récursif Problème d'appel de fonction dans . Pour la fonction en question :

      La fonction est : Entrée n, sortie n+1, si n+1<5, exécute fun(n+1), puis sortie n+1(pas bon Décrivez dans une courte phrase) :
    5. Ainsi, selon la description de la fonction, vous pouvez obtenir le processus d'exécution de la fonction et enfin obtenir le résultat.
    1. 🎜Exécutez fun(1) : entrée 1, sortie 2, 2+1<5, exécutez fun(2) et obtenez fun(2 ) Affichez le résultat, puis affichez 2. 🎜🎜Sortie finale🎜 : 2[output(fun(2))]2🎜🎜
    2. 🎜De même, résultat de sortie fun(2) : 3[output(fun(3))]3 🎜🎜sortie finale🎜 :23[output(fun(3))]32🎜🎜
    3. 🎜De même, résultat de sortie fun(3) : 4[output(fun(4))]4 🎜🎜sortie finale🎜 :234[output(fun(4))]432🎜🎜
    4. 🎜Exécuter fun(4) : puisque le jugement de 4+1<5 échoue, fun(5) n'est pas exécuté et le résultat de sortie est : 55 🎜🎜Sortie finale🎜 : 23455432🎜🎜 🎜

      répondre
      0
  • 伊谢尔伦

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

    Lors d'un retour récursif, cette phrase sera affichée à l'envers

    répondre
    0
  • 为情所困

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

    La fonction n'est pas asynchrone
    vous exécutez donc fun(1)
    2 $i++; echo $i;
    3 callback func(2) $i++; echo $i;
    4 callback func(3) $i++; ;
    5 Callback func(4) $i++; echo $i;
    5 Callback func(4) Parce qu'après $i++, il est déjà supérieur à 5, donc le echo $i suivant (l'écho du bas $i de fun(4) )) est exécuté. fun(4) toute l'exécution de la fonction se termine)
    4 Puisque l'exécution de func(4) est terminée, fun(3) continuera à être exécuté. L'écho du bas $i
    3 2 a également le même. logique

    répondre
    0
  • 世界只因有你

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

    Lorsque la fonction fun est récursive, lorsqu'il est jugé que $i < 5 est satisfait, elle s'appellera et la poussera sur la pile. En même temps, la dernière phrase de la fonction, echo $i, n'est pas exécutée. ; lorsque l'appel récursif atteint $i = 5 à ce moment-là, commencez à revenir au point de pile précédent de la fonction et continuez l'exécution. Autrement dit, exécutez la dernière phrase de la fonction echo $i;
    pour qu'elle génère 4, puis retourne à l'endroit où elle a été poussée sur la pile la dernière fois, et continue d'afficher 3... jusqu'à ce que la fonction fun revienne complètement. Passer à
    if ($i < 5) { return fun($i);} affichera 23455

    répondre
    0
  • 某草草

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

    Vous pouvez vous référer à cet article, et il sera clair si vous comprenez la récursivité. http://www.jianshu.com/p/8bee...

    répondre
    0
  • 天蓬老师

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

    Vous pouvez y penser de cette façon, ce que fait cette fonction, c'est que la première moitié fait écho à i, la seconde moitié fait écho à i, et un appel à lui-même est inséré au milieu jusqu'à ce que i=5, ce qui équivaut à faire écho à i jusqu'à 5. , puis revenir au début. Cela en vaut la peine. Ayez simplement une bonne relation avec l'intérieur et l'extérieur.

    répondre
    0
  • 仅有的幸福

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

    Merci à tous, je comprends

    répondre
    0
  • Annulerrépondre