On considère le script suivant.
n = 0
u = 1
while u < 100:
u = 2 * u
n = n + 1
print(n, u)a) Dresser le tableau des valeurs successives de u et n. b) Qu'affiche le script ? c) Quel problème mathématique résout-il ? d) Que se passerait-il si l'on remplaçait u = 2 * u par u = u / 2 ?
Voir la correction
a) Avant la boucle, u = 1 et n = 0. La condition u < 100 est testée avant chaque passage.
| passage | départ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
u | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
u = 128 : la condition 128 < 100 est fausse, la boucle s'arrête.b) Le script affiche
7 128.c) Il détermine le plus petit entier n tel que 2n ≥ 100 : c'est une recherche de seuil pour la suite géométrique un = 2n. On vérifie : 26 = 64 < 100 ≤ 128 = 27, et par le logarithme, ln 100ln 2 ≈ 6,64, dont le premier entier supérieur est 7.
d) Avec
u = u / 2, la variable u prendrait les valeurs 12, 14, 18, …, toujours strictement inférieures à 100 : la condition resterait vraie indéfiniment et le programme ne s'arrêterait jamais. Une boucle while n'est correcte que si une variable évolue vers la sortie ; ici, il faut que u finisse par dépasser 100, ce qui est garanti par 2n → +∞.