TD2 – Application : variants et invariants
- Identifier un variant de boucle ;
- Comprendre et formuler un invariant de boucle ;
- utiliser les étapes initialisation / maintenance / terminaison pour raisonner sur un algorithme.
Variant de boucle : test de palindrome
On considère un algorithme qui permet de vérifier si un mot est un palindrome, c’est-à-dire un mot qui se lit dans les deux sens.
def palindrome(mot) :
i = 0
j = len(mot)-1
pal = True
while i <= j and pal == True :
if mot[i] == mot[j] :
i = i+1
j = j-1
else :
pal = False
return pal
Principe de l’algorithme :
- une variable
icommence au début du mot ; - une variable
jcommence à la fin du mot ; - on compare les caractères situés aux positions
ietj; - si les caractères sont identiques, on avance
iet on reculej; - sinon, le mot n’est pas un palindrome.
Identifier le variant
- Quelle(s) variable(s) évoluent à chaque tour de boucle ?
- Expliquer pourquoi ces variables garantissent l’arrêt de la boucle.
Tracer l’exécution de l’algorithme
-
Compléter les tableaux suivants.
- radar
- sauras
Mot étudié : radar
Exécution i j pal Initialisation 0 vrai Tour 1 Tour 2 Tour 3 Mot étudié : sauras
Exécution i j pal Initialisation 0 vrai Tour 1 Tour 2 Tour 3 -
Pour quel mot l’algorithme s’arrête-t-il avec
pal = vrai? -
En quoi l’évolution de
ietjconstitue-t-elle un variant de boucle ?
Invariant de boucle : calcul d’une puissance de 2
def puissance(n):
p = 1
for k in range(n):
p = p*2
return p
On considère un algorithme qui :
- initialise une variable
pà 1 ; - répète
nfois une multiplication par 2 ; - renvoie la valeur finale de
p.
Invariant proposé
On propose l’invariant suivant :
À chaque début d’itération, la variable
pest égale à 2 exposant le nombre d’itérations déjà effectuées.
Vérification de l’invariant
En suivant la méthode du cours, expliquer pourquoi cet invariant est correct :
- Initialisation
Que vautpavant le premier tour de boucle ? - Maintenance
Pourquoi l’invariant reste-t-il vrai après un tour de boucle ? - Terminaison
Que vautplorsque la boucle se termine ?
Quelle valeur est alors renvoyée par l’algorithme ?
Invariant de boucle : tri par sélection
Le tri par sélection consiste à :
- chercher le plus petit élément d’une liste ;
- l’échanger avec le premier élément ;
- recommencer le même procédé à partir de la deuxième position, puis de la troisième, etc.
Comprendre le fonctionnement
- Dessiner les différentes étapes permettant de trier la liste suivante avec le tri par sélection :
[5, 3, 9, 1, 7]
Invariant du tri par sélection
On propose l’invariant suivant :
À chaque début d’itération, la partie gauche de la liste est triée et contient les plus petits éléments.
3. Vérification de l’invariant
À l’aide du tableau ci-dessous, répondre aux questions.
| i | État de la liste |
|---|---|
| 0 | 5 9 -1 2 7 |
| 1 | -1 9 5 2 7 |
| 2 | -1 2 5 9 7 |
| 3 | -1 2 5 7 9 |
| 4 | -1 2 5 7 9 |
- Initialisation
Pourquoi l’invariant est-il vrai au début de l’algorithme ? - Maintenance
Expliquer pourquoi l’échange effectué à chaque étape conserve l’invariant. - Terminaison
Pourquoi peut-on affirmer que la liste est triée à la fin de l’algorithme ? - Écrire l'algorithme du tri par sélection.