Le saut qui recule
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 18 — Algorithmique des textes
Énoncé
Le chapitre affirme que la ligne i = i + (saut > 1 ? saut : 1) est la terminaison de l'algorithme. Le prouver par un exemple : trouver un couple pour lequel le décalage calculé est négatif, et dire ce que fait le programme sans la garde.
Corrigé
Il suffit que la lettre fautive figure dans le motif après la position de l'échec. Le plus petit exemple : et .
La table vaut et . Trace, sans la garde :
tour 1 : i=0 echec en j=0 sur 'a', saut = 0 - 1 = -1, i <-- -1
tour 2 : i=-1 echec en j=0 sur ' ', saut = 0 - (-1) = 1, i <-- 0
tour 3 : i=0 echec en j=0 sur 'a', saut = 0 - 1 = -1, i <-- -1
tour 4 : i=-1 ... (le cycle se repete indefiniment)
Deux fautes, pas une. La boucle ne termine pas — c'est celle que le chapitre annonce. Mais avant cela, le tour lit t[-1] : un accès hors tableau, exactement la faute du chapitre chap:langage-c, que C ne signale pas. Le programme peut donc, selon ce qui se trouve avant le texte en mémoire, boucler, s'arrêter au hasard, ou planter.
La preuve de terminaison. Le variant est . Il est entier, minoré par dans la boucle (dont la condition est ), et il décroît strictement à chaque tour si et seulement si augmente d'au moins . La garde saut > 1 ? saut : 1 est précisément ce qui garantit cette croissance stricte. Sans elle, il n'y a pas de variant, et l'algorithme n'a pas de raison de terminer — ce que la trace confirme.
À retenir. Une expression qui a l'air d'une précaution (« au cas où ») mérite qu'on cherche le cas. Ici, le cas existe, il est atteint sur un texte de cinq lettres, et il fait deux dégâts. Quand une garde protège une terminaison, on l'écrit en commentaire à côté du variant, pas comme une prudence anonyme.
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.