Adloun

Écrire une boucle bornée et une boucle non bornée qui calculent toutes…

Exercice de TD · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Constructions élémentaires, traces et terminaison

Énoncé

Écrire une boucle bornée et une boucle non bornée qui calculent toutes deux la somme des entiers de à . Laquelle est préférable ? Pourquoi ?

Corrigé

Une boucle qui ne s'arrête jamais. Il suffit que le test reste vrai indéfiniment :


i = 0
while i < 10:
    print(i)          # on n'a pas touche a i : la condition reste vraie

L'erreur typique n'est pas d'écrire while True — celle-là se voit — mais d'oublier la ligne qui fait progresser la variable de contrôle.

Une boucle dont on ne sait pas compter les tours, mais qui s'arrête. Le nombre de divisions par deux de l'exercice précédent en est déjà un exemple. En voici un plus net, la suite de Syracuse :


def syracuse_vol(n):
    """Nombre d'etapes pour ramener n a 1 par la regle de Collatz."""
    etapes = 0
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        etapes = etapes + 1
    return etapes

print(syracuse_vol(7), syracuse_vol(27))     # 16 111

Personne ne sait prédire ce nombre sans dérouler la boucle : pour , elle fait tours et la valeur monte jusqu'à avant de redescendre. Sur les de à , le maximum est tours.

Honnêteté : l'arrêt de cette boucle n'est pas démontré pour tout — c'est la conjecture de Collatz, ouverte depuis 1937. On l'a vérifiée sur des valeurs immenses, ce qui, comme un jeu de tests, ne prouve rien. On y revient dans la banque supplémentaire.

Un exemple à terminaison certaine serait préférable pour illustrer la seconde question : while n &gt; 1: n = n // 2 s'arrête toujours, car décroît strictement dans , et l'on ne peut pas décroître indéfiniment dans les entiers positifs. C'est ce qu'on appellera un variant de boucle au chapitre 7.

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.