Lycée Victor Hugo MPSI-PCSI 2016-2017
Algorithme du maximum
Algorithme du calcul du maximum d’une liste non vide
def maxim um ( L ) :
""" Retourne la valeur m ax im al e des élé ments d ’ une liste L .
L est une liste de nombres , sup pos ée non vide .
"""
maxi = L [0]
for iin ran ge (1 , len (L)):
if L [ i ] > maxi :
maxi = L[i]
return maxi
•Terminaison
La terminaison de cette fonction est garantie car il y a seulement une boucle for inconditionnelle, qui
n’est exécutée qu’un nombre fini de fois (ici la longueur de la liste moins 1).
•Correction
Pour prouver que le résultat final est correct on définit ce qu’on espère être un invariant de boucle :
Soit nla longueur de la liste Let H(k)l’affirmation : « À la fin de l’itération pour i=kdans la
boucle for, la valeur maxikde la variable maxi est le maximum de la liste [L[0], ..., L[k]] ».
H(0) désigne la même propriété juste avant d’entrer dans la boucle. Ainsi H(k)est définie pour k < n.
*initialisation
Avant d’entrer dans la boucle, via l’initialisation maxi0=L[0], c’est bien le maximum de la liste à un
élément [L[0]] :H(0) est vraie.
*hérédité
Supposons H(k)vraie pour un entier k∈J0, n −2K(pour qu’un passage de plus dans la boucle ait
lieu). Au début de l’itération pour i=k+ 1,maxikest donc le maximum de [L[0], ..., L[k]].
Deux cas possibles se présentent :
•ou bien L[k+1] > maxik, ce qui signifie que L[k+1] est plus grand que tous les termes pré-
cédents de la liste. Dans ce cas L[k+1] est le maximum de la liste [L[0], ..., L[k+1]], et
c’est la valeur maxik+1.
•ou bien L[k+1] 6maxik: dans ce cas le maximum de [L[0], ..., L[k+1]] est le même que
celui de [L[0], ..., L[k]]. Comme la valeur de max n’est pas modifié, on a aussi maxik+1 =
maxik.
Dans les deux cas, H(k+ 1) est vraie.
*exploitation
À la sortie de la boucle, on a i=n−1. Or par récurrence (limitée) H(n−1) est vraie donc la variable
codemax contient le maximum de [L[0], ..., L[n-1]] autrement dit de la liste Lcomplète. La
fonction est valide.
2