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 #-o
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 :arrow: 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.