Adloun

É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.