Écrire un variant pour la boucle while n!= 1
Exercice de TD · niveau 2 · NSI (première), chapitre 7 — Parcourir, trier, prouver · Variants, terminaison, mesure
Énoncé
Écrire un variant pour la boucle while n != 1: n = n // 2 avec n entier strictement positif, et prouver qu'elle s'arrête. Combien de tours effectue-t-elle ? (chapitre 1)
Corrigé
Le variant : n lui-même.
Entier et positif : n est entier par hypothèse, et la division entière d'un entier strictement positif par reste positive ou nulle. En fait elle reste : si , alors .
Strictement décroissant : on entre dans le corps seulement si , donc — n étant — si . Et pour , , l'inégalité étant stricte.
Une suite d'entiers strictement décroissante est finie : la boucle s'arrête, et elle s'arrête sur n , puisque c'est la seule valeur qui ne permet pas d'entrer.
Le nombre de tours : . Chaque tour retire un bit à l'écriture binaire de n (chapitre 1) ; on s'arrête quand il n'en reste qu'un. Un entier s'écrit sur bits, donc il faut tours.
| tours | ||
|---|---|---|
Vérification : l'égalité a été contrôlée pour tous les de à — elle tient partout.
Le piège de la précondition. Pour , la boucle ne s'arrête jamais : , et . Le variant n'y décroît pas. Pour négatif, c'est pire : en Python, la suite décroît sans jamais valoir — le variant décroît bien, mais il n'est pas positif, et c'est cette hypothèse-là qui manque. Un variant a trois conditions, et les trois servent.
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.