
Informatique    TD/TP 0.5  Algorithmes 
Lycée Jules Ferry Cannes    Page 2 sur 3  TSI2 
Les principales capacités développées dans cette partie de la formation sont : 
• comprendre un algorithme et expliquer ce qu’il fait, 
• modifier un algorithme existant pour obtenir un résultat différent, 
• concevoir un algorithme répondant à un problème précisément posé, 
• expliquer le fonctionnement d’un algorithme, 
• écrire des instructions conditionnelles avec alternatives, éventuellement imbriquées, 
• justifier qu’une itération (ou boucle) produit l’effet attendu au moyen d’un invariant, 
• démontrer qu’une boucle se termine effectivement, 
• s’interroger sur l’efficacité algorithmique temporelle d’un algorithme. 
 
1)  Expliquer comment fonctionne l'algorithme maximum ? 
2)  Ecrire une fonction maximumW à l'aide d'une boucle conditionnelle while. Quel est le danger d'une 
boucle while en général et l'intérêt d'une boucle while dans ce cas particulier ? 
3)  Ecrire une fonction chercherF à partir d'une boucle inconditionnelle for. Quel est l'intérêt de la boucle 
while dans ce cas particulier ? Quel est l'algorithme le plus efficace temporellement ? 
4)  Illustrer la différence de comportement en traçant les tables d'évolution des variables de la boucle 
dans le cas où l'on recherche 2 dans la liste [3, 2, 5, 6]. 
5)  Ecrire l'instruction qui permet de lancer la recherche précédente avec la fonction chercher. 
 
Rappel [1] 
Pour effectuer la preuve partielle d’une boucle, il faut tout d’abord trouver un invariant de  boucle c’est-à-
dire  une  affirmation  ou  assertion  vraie  à  chaque  fois  que  l’exécution  du  programme  atteint  le  début  de 
chaque itération de la boucle et qui permet de déduire le résultat voulu, si l’exécution de la boucle while se 
termine. 
Une formule I(c) est un invariant si : 
-  I(0)  est  vrai  au  début  de  l’exécution de  la  boucle while au moment où  l’exécution  du  programme 
atteint cet endroit. 
-  Ayant  I(c)  vrai  et  la  condition  de  continuation  du  while  également  vraie  (et  donc  que  le  corps  du 
while  est  évalué  une  fois  de  plus),  il  faut  pouvoir  vérifier  qu’après  l’exécution  d’une  itération  du 
corps la boucle while, l’invariant I(c+1) est à nouveau vrai. 
-  Enfin  pour  effectuer  la  preuve  partielle,  cet  invariant,  composé  avec  le  fait  que  la  condition  de 
continuation du while devienne fausse, doit permettre de vérifier que la boucle while a effectivement 
‘’calculé’’ le résultat R qui lui était demandé. 
Preuve totale : 
-  il faut montrer qu'il existe un variant de boucle dont la valeur décroissante mettra fin aux itérations 
lorsqu'il atteindra 0. 
Remarque : la difficulté de la preuve réside généralement dans la recherche de l'invariant de boucle. 
 
6)  Pour la fonction chercher montrer que la formule  I(c)="x n'est pas présent dans la liste L[0:c] ou s 
est vrai" est un invariant de boucle et que n-c est le variant de boucle. 
7)  Dans quelle fonction trouve-t-on des instructions conditionnelles imbriquées. 
8)  Indiquer la modification à apporter à la fonction dichotomie pour qu'elle soit compatible avec les 
erreurs d'arrondi des flottants (on remplace la comparaison par une inégalité faisant apparaitre une 
erreur E affectée dans le corps du programme). 
9)  Modifier la fonction dichotomie afin qu'elle renvoie la position du premier indice rencontré pour la 
position d'un flottant x dans la liste L. La fonction devra renvoyer None dans le cas où x n'est pas 
présent. 
10) De quel type est la complexité temporelle de dichotomie et celle de recherche ? Quel est l'algorithme 
le plus efficace temporellement ?