Invariant/variant boucle

Résolu
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

  1. Contributeur
    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?
    1. Contributeur
      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?
  2. 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