Invariant/variant boucle [Résolu]

Signaler
-
Messages postés
13052
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
-
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

Messages postés
13052
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727
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?
Messages postés
13052
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727
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?
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
Messages postés
13052
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727
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