Programme récursif - Ada - Programmation
Marsh Posté le 05-04-2009 à 16:49:07
dj_titeuf a écrit : Je ne saisis pas bien pourquoi, pourriez-vous me le détailler un peu svp? |
Déroules l'exécution à la main
Et accessoirement, ça ne renvoie rien, ça affiche "0 1 2 3 4"
Marsh Posté le 05-04-2009 à 17:17:09
masklinn a écrit : |
Justement, c'est là où je bloque.. Voici comment je le comprends:
on a N=4: on vérifie donc bien N /=0, donc le programme s'appelle lui-même en prenant pour nouveau paramètre 4-1=3, etc, jusqu'à N=1. Et à partir de là, on afficherait donc simplement 1... Mais bon, ce raisonnement est incorrect apparemment!
Marsh Posté le 05-04-2009 à 17:30:22
dj_titeuf a écrit : |
La partie en gras est là où tu fais une grosse erreur.
Déroules la stack d'exécution à l'écrit, genre
Foo(X = 42) |
Marsh Posté le 05-04-2009 à 17:43:11
Euh... Essayons d'aller plus doucement, du moins moi.
Pour N=4, la condition N/=0 est bien respectée, donc à priori, on rentre dans le if, Test(3) est alors appelé; on repart alors au begin, la condition est de nouveau vérifiée (3 /=0), puis Test(2) est appelé, puis alors Test(1). On repart au begin, la condition d'entrée est toujours vérifiée (1 /=0), alors Test(0) est appelé. Là par contre, la condition n'est plus vérifiée, on n'entre donc pas dans le if, et on se contente d'aller au put, qui affiche donc 0 (par contre, vu que c'est put(N,5), il devrait afficher un "blanc" en plus, à cause du 5 non?). Une fois parvenu ici, j'aurais eu tendance à dire que l'instruction se terminait..
Marsh Posté le 05-04-2009 à 17:44:21
dj_titeuf a écrit : Une fois parvenu ici, j'aurais eu tendance à dire que l'instruction se terminait.. |
Quelle instruction?
Marsh Posté le 05-04-2009 à 17:51:58
Enfin, je voulais dire, le programme général.. Mais encore une fois, ce n'est pas le cas, bien que je ne voie pas pourquoi..
Marsh Posté le 05-04-2009 à 17:57:23
dj_titeuf a écrit : Enfin, je voulais dire, le programme général.. |
Pourquoi ça ferait un truc pareil
Marsh Posté le 05-04-2009 à 18:00:07
Parce que le programme a "fini"? On est allé jusqu'au cas N=0, et on a affiché 0, je ne vois pas ce qu'il peut faire d'autre ensuite..
Marsh Posté le 05-04-2009 à 18:01:25
dj_titeuf a écrit : Parce que le programme a "fini"? On est allé jusqu'au cas N=0, et on a affiché 0, je ne vois pas ce qu'il peut faire d'autre ensuite.. |
Bah continuer à exécuter le programme, il reste plein de trucs pas exécutés si on remonte la call stack
Marsh Posté le 05-04-2009 à 18:03:40
Et bien, ce doit être là que mon problème de compréhension se situe... Peut-être pourrais-tu m'expliquer stp?
Marsh Posté le 05-04-2009 à 18:15:54
dj_titeuf a écrit : Et bien, ce doit être là que mon problème de compréhension se situe... Peut-être pourrais-tu m'expliquer stp? |
On va étendre le contenu de Test_Recursif:
Code :
|
On va utiliser le modèle de substitution de Structure and Interpretation of Computer Programs (je recommande d'ailleurs fortement de le lire)
Donc si on substitue le contenu de Test à cet appel, on se retrouve avec
Code :
|
Ligne 2 on a un Test, donc on continue à substituer
Code :
|
et encore
Code :
|
et encore
Code :
|
et encore
Code :
|
Ici, on a 0 /= 0 qui est true, donc Test(0-1) n'est jamais exécuté, donc on a pas besoin de l'étendre, et on peut simplifier l'expression développée en retirant toute la condition:
Code :
|
On exécute ça séquentiellement, et on voit bien qu'on se retrouve avec put(0, 5); put(1, 5); put(2, 5); put(3, 5); put(4, 5);
Marsh Posté le 05-04-2009 à 18:20:33
Merci beaucoup pour tous ces détails! En fait, je pensais qu'une fois le premier put effectué, le programme se terminait, alors qu'en fait, il semble revenir au début..
Marsh Posté le 05-04-2009 à 18:22:34
dj_titeuf a écrit : il semble revenir au début.. |
non.
Marsh Posté le 05-04-2009 à 18:25:03
Ah... Bon, je vais lire et relire tranquillement tes explications, et tenter de mieux cerner le principe. Encore merci.
Marsh Posté le 05-04-2009 à 16:40:42
Bonjour,
Voici un petit programme récursif, simpliste, mais que je ne parviens pas trop à comprendre..
A première vue, ce programme est censé renvoyer: 01234. Je ne saisis pas bien pourquoi, pourriez-vous me le détailler un peu svp?
Merci d'avance!