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 ?