fonction php, le résultat est inattendu
黄舟
黄舟 2017-05-24 11:34:32
0
7
847
<?php
function fun($i) {
    $i++;
    echo $i;
    if ($i<5) {
        fun($i);
    }
    echo $i;
}
fun(1);
我以为结果会是:23455,实际上是23455432,请问这个432是什么情况?
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(7)
PHPzhong

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🎜🎜 🎜
伊谢尔伦

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

为情所困

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

世界只因有你

Lorsque la fonction fun est récursive, lorsqu'il est jugé que $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

某草草

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

Peter_Zhu

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.

仅有的幸福

Merci à tous, je comprends

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal