Lorsqu’on écrit un algorithme, trois questions fondamentales se posent :
Remarque : Démontrer la terminaison et la correction d’un algorithme s’appelle faire la preuve de cet algorithme.
Considérons l’algorithme suivant :
def fonc(n):
'''
param n: (int) un entier positif ou nul
return (int)
'''
resultat = 1
i = 0
while i < n:
i = i + 1
resultat = resultat * 2
return resultat
🖊️ 1) Que fait cet algorithme (à trouver sans essayer l’algorithme) ? Compléter la docstring et changer le nom de cette fonction.
🖊️ 2) Quel est le variant convergeant de boucle pour cet algorithme.
🖊️ 3) Trouver un invariant de boucle. On pourra écrire une relation entre les différentes variables.
def recherche_dicho(E,L):
'''
Recherche dichotomique d'un élément dans une liste d'entiers triée.
Renvoie la position de l'élément s'il est présent dans la liste.
Renvoie None si l'élément n'est pas présent dans la liste.
param L : (list) une liste d'entiers triés par ordre croissant
param E : (int) un entier
return : (int) position de l'entier ou -1
'''
debut = 0
fin = len(L)-1
milieu = (debut + fin) // 2
while (debut - fin) <= 0 :
if E > L[milieu]:
debut = milieu + 1
elif E < L[milieu]:
fin = milieu - 1
else :
return milieu
milieu = ( debut + fin ) // 2
return -1
🖊️ Trouver un variant convergent de boucle pour montrer la terminaison de l’algorithme.
Ici, il faut trouver un invariant de boucle, c’est à dire trouver une propriété qui est vraie avant la boucle et à la fin de chaque boucle.
Voici l’invariant :