Reprendre le premier programme du chapitre (celui qui calcule total…
Exercice de TD · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Constructions élémentaires, traces et terminaison
Énoncé
Reprendre le premier programme du chapitre (celui qui calcule total, message et etapes pour ). Dérouler à la main la boucle while, en dressant le tableau des valeurs de reste et de etapes après chaque tour. Prédire ensuite la valeur de etapes pour , puis vérifier sur machine. Enfin, exprimer etapes en fonction du nombre de bits de .
Corrigé
La trace, pour . On part de reste = 7 et etapes = 0. Le test est évalué avant chaque tour.
| tour | test | reste | etapes |
|---|---|---|---|
| --- | --- | 7 | 0 |
| 1 | vrai | 3 | 1 |
| 2 | vrai | 1 | 2 |
| --- | faux : sortie | 1 | 2 |
La boucle fait donc deux tours et etapes vaut .
Prédiction pour . Chaque tour divise par deux : . Six tours.
Vérification.
def etapes_de(n):
"""Nombre de divisions par 2 pour ramener n >= 1 a 1."""
reste = n
etapes = 0
while reste > 1:
reste = reste // 2
etapes = etapes + 1
return etapes
print(etapes_de(7), etapes_de(100)) # 2 6
Le lien avec le chapitre 1. Diviser par deux, c'est effacer le bit de poids faible. Partir d'un nombre de bits et arriver à (un seul bit) demande donc effacements :
for n in range(1, 100000):
assert etapes_de(n) == nb_bits(n) - 1
Les cas passent. Contrôle : a trois bits, et ; en a sept, et .
Piège de la trace : placer la mise à jour de etapes avant celle de reste ne change rien ici, mais écrire le test après le corps — c'est-à-dire une boucle « répéter jusqu'à » — donnerait un tour de plus pour .
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.