Invariant/variant boucle

Résolu/Fermé
Mrpython - 7 nov. 2020 à 18:06
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 - 7 nov. 2020 à 22:31
Bonjour,

Je suis en licence et débutante en programmation sur python.
J'ai un exercice à rendre mais je ne comprends pas bien certains points.

Après avoir écrit la définition de factorielle, on me demande de trouver un invariant et un variant de boucle.

Ma définition est :

def factorielle(n):
’’’ int -> int
Hypothèse : n > 0
Retourne le produit factoriel n!’’’
# k : int
k = 1 # on demarre au rang 1
# f : int
f = 1 # factorielle au rang 1
while k <= n:
f = f * k
k = k + 1
return f

Comme invariant j'ai pensé : f = 1*(f-1)*f

Voila, j'aimerais que l'on puisse me dire si je suis sur la bonne voie pour l'invariant...et comment trouver le variant.

Je vous remercie.

2 réponses

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
7 nov. 2020 à 19:44
bonjour,
peux-tu utiliser les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

as-tu vérifié avec quelques exemples que ton invariant était vrai?
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
7 nov. 2020 à 19:49
je pense qu'il serait utile de partir des définitions du variant et de l'invariant, et de à quoi cela sert.
peux-tu décrire ce que tu comprends de ces définitions?
0
Bonsoir,
J'ai compris qu'un invariant est une expression mathématiques qui est vraie en entrée, à la fin de chaque tour et en sortie de boucle.
Le variant lui est un entier positif en entrée de boucle, il diminue à chaque tour et vaut 0 en sortie de boucle. Donc pour moi le variant est un peu l'inverse de la définition de base de type:

def factorielle(n):
"""int->int
hypothèse : n>=0
Retourne le produit factoriel n!"""
# k : int
k=n # on démarre au rang 1
# f : int
f=1 # factorielle au rang 1
while k!=0:
f=f*k
k=k-1
return f

Merci pour votre aide
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
7 nov. 2020 à 22:31
donc 123=123 te semble un bon invariant?
l'invariant que tu proposes te semble-t-il correspondre à la définition?

c'est quoi une définition de base de type?

peux-tu utiliser les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0