Python (école d'ingénieur) · Chapitre 6 · Exercice
Preuve par invariant et complexité
Complexité algorithmique
Énoncé
On considère l'algorithme itératif suivant qui calcule la factorielle d'un entier :
def factorielle(n):
i, f = 1, 1
while i <= n:
f = f * i
i = i + 1
return f
- Énoncer un invariant de la boucle.
- Prouver la correction partielle de l'algorithme à l'aide de cet invariant.
- Démontrer sa terminaison et donner sa complexité temporelle et spatiale.
Corrigé
- Invariant de boucle : Proposons la propriété suivante : à l'entrée de la boucle
while, la variable stocke le produit des entiers de 1 à , c'est-à-dire :
- Preuve de correction :
- Initialisation : Avant la première itération, et . L'invariant donne , ce qui est vrai.
- Conservation : Supposons l'invariant vrai à l'entrée de la boucle pour une valeur de . Durant l'itération, les variables sont mises à jour : À la fin de la boucle, nous avons bien : L'invariant est conservé.
- Terminaison et Correction totale : La variable est initialisée à 1 et est incrémentée de 1 à chaque tour. Comme est constant, la condition de boucle finira par devenir fausse (quand ), ce qui assure la terminaison de la boucle. À la terminaison de la boucle, on a . D'après l'invariant : La fonction retourne , soit exactement . L'algorithme est correct.
Complexités :
- Temporelle : La boucle effectue itérations. Chaque itération réalise un nombre constant d'instructions élémentaires. La complexité temporelle est : .
- Spatiale : Seules deux variables de travail (
ietf) sont utilisées en mémoire. La complexité spatiale supplémentaire est : (constante).
100 % gratuit
La suite du chapitre est sur Adloun
- 7 autres exercices corrigés dans ce chapitre, et 7 à chercher avec le tuteur
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.