Page 1 sur 1
fonction récursive; je ne comprends pas ce résultat
Posté : 29 juin 2016, 20:09
par carte-sd
Bonsoir à tous,
Code : Tout sélectionner
<?php
function test()
{
static $count = 0;
$count++;
echo $count . ' ';
if ($count < 10):
test();
endif;
$count--;
echo $count . ' ';
}
test();
?>
J'ai trouvé cet exemple sur le site php.net, en le testant je m'attendais à ce que la fonction se termine sur un $count décrémenté à 9 lorsque $count = 10 mais voici le résultat :
1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 0
Je me gratte la tête depuis 10 minutes, je ne comprends pas

Quelqu'un peut m'expliquer ?
Re: fonction récursive; je ne comprends pas ce résultat
Posté : 29 juin 2016, 20:26
par @rthur
Bah, suis ton code étape par étape et c'est assez logique qu'il donne ce résultat.
Au moins le début, ça ne peut pas démarrer à 9...
1) Tu fais un appel à test()
2) Tu affectes 0 à $count
3) Tu incrémente $count (donc il est égal à 1)
4) Tu affiches $count (donc ça t'affiche 1, et il n'y a aucune chance que ça t'affiche 9 en premier...)
5) Tu testes si $count est inférieur à 10 et c'est bien le cas vu qu'il est égal à 1 => donc tu rappel test()
6) En indiquant static, ta variable $count n'est pas remise à 0
7) Tu incrémentes $count (qui vaut donc 2 désormais)
8) Tu affiches $count (donc ça t'affiche 2)
etc...
Et quand ton test de <10 devient faux alors il passe à la suite du code et donc à la décrémentation...
Re: fonction récursive; je ne comprends pas ce résultat
Posté : 29 juin 2016, 20:42
par carte-sd
Et quand ton test de <10 devient faux alors il passe à la suite du code et donc à la décrémentation...
C'est justement cette partie que je ne comprends pas... Lorsque $count = 10 il n'y a pas d'autre appel à la fonction.
Re: fonction récursive; je ne comprends pas ce résultat
Posté : 29 juin 2016, 20:52
par or 1
le code après le endif est exécuté à un moment. quand on arrete d'appeler à nouveau test(), alors chacun des appels précédents à test() continue après le endif.
Re: fonction récursive; je ne comprends pas ce résultat
Posté : 29 juin 2016, 20:57
par @rthur
Si tu mets en commentaire ton if(), tu es d'accord, qu'il va faire l'incrémentation, puis la décrémentation ?
Là entre les 2 tu fais un appel à une autre fonction.
Donc il fait
1) incrémentation
2) appel à une autre fonction
... là on attend que la fonction appelé en 2) se termine (et ses sous-fonctions aussi...)
3) décrémentation
Si je réduis ton test if à 3, ça donnerai ça en terme d'étape :
1) incrémentation
2) appel de test()
2.1) incrémentation
2.2) appel de test()
2.2.1) incrémentation
2.2.2) appel de test()
2.2.2.1) incrémentation
2.2.2.2) PAS d'appel de test() car > 3
et donc on termine l'exécution de chaque fonction test() dans l'ordre inverse de l'appel.
2.2.2.3) décrémentation
2.2.3) décrémentation
2.3) décrémentation
3) décrémentation
Re: fonction récursive; je ne comprends pas ce résultat
Posté : 29 juin 2016, 21:00
par carte-sd
Ok, je pensais pas que ça reprenait après pour finir le code, je pensais que l'appel à la fonction agissait comme un return. Merci pour ces éclaircissements.