NSI (première) · Chapitre 3 · Exercice de TD
Écrire une fonction racine entiere(n) renvoyant ⌊√n⌋ sans utiliser…
Langages et programmation · Spécifier : prototype, préconditions, postconditions · niveau 3 (difficile)
Énoncé
Écrire une fonction racine_entiere(n) renvoyant sans utiliser math.sqrt, avec précondition et postcondition exprimées par des assertions. Indication pour la postcondition : .
Corrigé
def racine_entiere(n):
"""Partie entiere de la racine carree de n.
Precondition : n est un entier >= 0.
Postcondition : r*r <= n < (r+1)*(r+1).
"""
assert n >= 0, "n doit etre positif ou nul"
r = 0
while (r + 1) * (r + 1) <= n:
r = r + 1
assert r * r <= n < (r + 1) * (r + 1)
return r
Pourquoi la postcondition est la bonne. Elle ne mentionne ni racine carrée ni flottant : elle est écrite entièrement avec des entiers et des multiplications. C'est ce qui la rend vérifiable sans risque — l'avertissement du cours sur les postconditions flottantes ne s'applique pas ici. Et elle caractérise de façon unique : deux entiers distincts ne peuvent pas vérifier tous deux cet encadrement.
Invariant et terminaison. L'invariant est r * r <= n : il est vrai au départ () et le corps ne s'exécute que si , ce qui le préserve. Le variant est , entier positif qui décroît strictement : la boucle s'arrête.
La vérification.
for n in range(0, 10001):
r = racine_entiere(n)
assert r * r <= n < (r + 1) * (r + 1)
Les cas passent. Contrôles : , , et puisque .
Pourquoi éviter math.sqrt : sur de grands entiers, la racine flottante peut tomber juste en dessous d'un entier exact, et int(math.sqrt(n)) rend alors . La version entière n'a pas ce défaut, parce qu'elle ne quitte jamais .
100 % gratuit
Essaie le suivant avec le tuteur
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 16 autres exercices corrigés dans ce chapitre, et 20 à chercher avec le tuteur
- Le podcast et la vidéo du chapitre et la correction filmée du TD : 2 minutes sans compte
Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.