Maison > Questions et réponses > le corps du texte
<?php
function fun($i) {
$i++;
echo $i;
if ($i<5) {
fun($i);
}
echo $i;
}
fun(1);
我以为结果会是:23455,实际上是23455432,请问这个432是什么情况?
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
(不好用一个简短的句子描述):
所以根据功能描述,可以得到函数的执行过程,最后得到结果.
执行 fun(1)
: 输入 1, 输出 2, 2+1<5,执行 fun(2)
,得到 fun(2)
输出的结果,再输出 2.
最终输出: 2[输出(fun(2))]2
同样,fun(2)
输出结果: 3[输出(fun(3))]3
最终输出:23[输出(fun(3))]32
同样,fun(3)
输出结果: 4[输出(fun(4))]4
最终输出:234[输出(fun(4))]432
执行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 :
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) :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🎜🎜
fun(2)
: 3[output(fun(3))]3 🎜🎜sortie finale🎜 :23[output(fun(3))]32🎜🎜
fun(3)
: 4[output(fun(4))]4 🎜🎜sortie finale🎜 :234[output(fun(4))]432🎜🎜
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🎜🎜
🎜为情所困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
世界只因有你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
某草草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...
天蓬老师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.