Écrire puissance(x, n) par une boucle bornée, sans utiliser…
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Écrire et spécifier ses propres fonctions
Énoncé
Écrire puissance(x, n) par une boucle bornée, sans utiliser l'opérateur **. Donner précondition et postcondition. Que doit rendre puissance(0, 0), et pourquoi ?
Corrigé
def puissance(x, n):
"""x eleve a la puissance n.
Precondition : n est un entier >= 0.
Postcondition : le resultat vaut le produit de n facteurs egaux a x.
"""
assert isinstance(n, int) and n >= 0, "l'exposant doit etre un entier >= 0"
p = 1
for _ in range(n):
p = p * x
return p
L'invariant. Après tours, p vaut . Il est vrai au départ (, ) et chaque tour le préserve. À la sortie, : c'est la postcondition. L'accumulateur d'un produit s'initialise à , comme celui d'une somme s'initialise à — dans les deux cas, l'élément neutre de l'opération.
Le cas . La boucle ne s'exécute pas, et p garde sa valeur . Ce n'est pas un artefact : la postcondition dit « le produit de facteurs », et le produit de zéro facteur vaut par convention, comme la somme de zéro terme vaut . C'est aussi ce que rend Python : 0**0 vaut . La convention est cohérente avec le dénombrement — il y a exactement une application de l'ensemble vide dans l'ensemble vide.
La vérification.
for x in range(-6, 7):
for n in range(0, 11):
assert puissance(x, n) == x**n
Les cas passent, signes négatifs compris. Contrôle : puissance(2, 10) vaut .
La précondition sur le type de , et pas seulement sur son signe, est ici utile : range(2.5) lèverait TypeError avec un message obscur, alors que l'assertion dit tout de suite ce qui ne va pas.
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.