Descente et remontée
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 5 — Récursivité
Énoncé
Ces deux fonctions ne diffèrent que par l'ordre de deux instructions. Qu'affiche chacune pour ? Laquelle garde cinq blocs d'activation ouverts jusqu'au bout ?
let rec avant n = if n > 0 then (print_int n; print_char ' '; avant (n-1))
let rec apres n = if n > 0 then (apres (n-1); print_int n; print_char ' ')Corrigé
avant 5 : 5 4 3 2 1
apres 5 : 1 2 3 4 5
avant écrit à la descente : chaque activation affiche son nombre puis délègue. apres écrit à la remontée : chaque activation délègue d'abord et n'affiche qu'au retour de son appel — donc dans l'ordre inverse de la descente.
Ce qui se joue là. Un appel récursif offre deux moments d'action, l'aller et le retour ; une boucle n'en offre qu'un. C'est précisément ce qui fait marcher la fonction binaire du cours : les divisions se font à la descente, les concaténations à la remontée, et les bits sortent dans le bon ordre sans qu'on ait rien à renverser.
C'est apres qui garde les cinq blocs : elle ne peut rien écrire avant d'être arrivée au fond. Dans avant, l'appel est la dernière chose que fait la fonction — un appel terminal, au sens de la dernière section du chapitre — et le bloc courant peut être réutilisé.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.