Vous êtes sur la page 1sur 4

.

Université de Yaoundé 1 University of Yaounde I


Faculté des Sciences Faculty of Science
Département d'Informatique Department of Computer Science

Chapitre 1 : Technique de Construction des Boucles

Structure Générale d’une Boucle


<Initialisation qui garantit l’invariant>
{<Enoncé de l‘invariant>}
{<Enoncé du variant>}
Jusqu’à <Condition d’arrêt> faire
début
<Actions qui font progresser le calcul, réduisent le variant, maintiennent l’invariant >
fin
{<Condition finale> = <Invariant> et <Condition d’arrêt>}
<Action qui finalise la tâche visée par la boucle>

Commentaires
Lorsqu’on écrit une boucle, on doit s’assurer de deux choses à savoir :
 qu’elle ne boucle pas à l’infini, et donc que son exécution finit par s’arrêter
 qu’à la sortie, elle produit le résultat escompté.
Pour démontrer la terminaison d’une boucle, on exhibe une quantité, fonction des
paramètres et strictement positive, qui décroit strictement à chaque itération. C’est le
variant. Pour démontrer qu’une boucle produit le résultat escompté, on exhibe un
invariant, c-à-d une propriété qui :
 est vérifiée avant l’entrée dans la boucle
 si elle est vérifiée avant une itération, alors elle est vérifiée après celle-ci
 le résultat escompté à la fin de la boucle, est modélisé par
<Condition_finale> = <Invariant> et <Condition d’arrêt>
A noter qu’il est souvent utile de représenter l’invariant en utilisant un dessin.

Exercice 1 : Ecrire avec invariant, variant puis preuve de validité, les algorithmes permettant de
résoudre les problèmes suivants :

1/4
 Recherche séquentielle d’un élément val dans un vecteur V[1..n]
 Recherche séquentielle avec sentinelle en position 0, d’un élément val dans un vecteur
V[1..n]
 Recherche dichotomique d’un élément val dans un vecteur trié V[1..n].
 Indication : Réduire systématiquement l’intervalle de recherche à un point.
 Fusion de deux vecteurs triés par ordre croissant A[p..q] et B[r..s] dans C[n..m].
 A partir d’un sous-vecteur trié V[1..i-1], créer un vecteur trié V[1..i], par insertion de V[i]

Exercice 2 (Algorithme de segmentation d’un vecteur V[min..max] )


On se propose de concevoir un algorithme de segmentation qui, pour un vecteur V[min..max],
place V[max] = X à sa place définitive k de sorte que :
- pour tout r tel que r < k, on a V[r ]  X
- pour tout s tel que s > k, on a V[s ]  X
Indication : Considérer deux indices i et j, puis faire progresser i vers la droite et j vers la gauche
en garantissant l’invariant suivant :
- pour tout r tel que r  i, on a V[r ]  X. Tout se passe comme si on a un tamis dont la
position dans V est représentée par i, et qui se déplace vers la droite en laissant passer
uniquement les éléments plus petits que X.
- pour tout s tel que s  j, on a V[s ]  X. Tout se passe comme si on a un tamis dont la
position dans V est représentée par j, et qui se déplace vers la gauche en laissant passer
uniquement les éléments plus grands que X
- il existe entre i et j un élément supérieur ou égal à X
2.1) Donner l’initialisation de i et j
2.2) Quelle est la condition d’arrêt de la grande boucle globale qui permet de déplacer les deux
tamis jusqu’à ce que leurs positions coïncident ?
2.3) Exprimer la condition finale de la boucle globale et déduire l’action finale
2.4) Dire pourquoi c’est le tamis de gauche qui doit être examiné en premier.
2.5) Décrire les trois situations qui peuvent se présenter pour le couple de tamis et donner pour
chaque cas l’action à exécuter
2.6) Donner l’algorithme ainsi obtenu
2.7) Dire comment optimiser cet algorithme en avançant à chaque fois un tamis jusqu’au blocage et
donner le nouvel algorithme.

Exercice 3 (Algorithme d’Euclide pour le calcul du pgcd)


Ecrire un algorithme de calcul du pgcd de deux nombres strictement positifs a, b, et qui est basé sur
les propriétés suivantes :

2/4
 Si x > 0 alors pgcd (x, 0) = x
 Si x > 0 et y > 0, alors pgcd(x, y) = pgcd (y, r) où r est le reste de la division de x par y.
On précisera les éléments suivants : invariant, variant, condition de sortie, condition finale.

Exercice 4
Dire ce que fait le programme suivant et le prouver :
i := 1 j := n
tantque i<j faire
si t(i)<=t(j) alors i := i+1
sinon j := j-1
resultat := t(i)

Exercice 5 (Drapeau tricolore)


On considère le tri d’un vecteur V[1..n] dont les éléments ont trois valeurs possibles : vert, rouge et
jaune. Montrer qu’on peut adapter la segmentation pour trier en temps linéaire ce vecteur
Indication : utiliser trois pointeurs i, j, k avec pour invariant :
 V[r] = vert pour r < i
 V[r] = rouge pour j+1  r  k
 V[r] = jaune pour k < r
La partie non triée correspond donc à l’intervalle [i..j].

Exercice 6 (Méthode du gradient)


On s’intéresse au calcul d’une approximation de la racine x* d’une fonction continue f sur un
intervalle [a, b] tel que f(a) < 0 et f(b) > 0.
6.1) Rappeler le théorème de la valeur intermédiaire
6.2) Compléter l’instruction conditionnelle ci-dessous qui réduit l’intervalle [a, b] de moitié
tout en garantissant qu’il contient une racine x* de f.
6.3) Dire pourquoi un intervalle [a, b] contenant une racine x* de f, permet d’avoir une
approximation x’ telle que |x’ – x*| ≤ |a-b|/2.
6.4) Compléter la boucle ci-dessous qui, pour  donné, permet de calculer une approximation
à /2 près de la racine x*.
min := a ; max := b
<invariant>
Jusqu’à <condition de sortie> faire
<invariant>
<Mise à jour de min et max avec mise en évidence de la diminution du variant>
x* := <approximation proposée>
6.5) Dire pourquoi si f’ est continue avec f’(a) < 0 et f’(b) > 0, alors le minimum x* de f est dans
l’intervalle a, b.
6.6) Rappeler le théorème des accroissements finis pour les intervalles [a, x*] et [x*, b]
6.7) Déduire une valeur x’ telle que
f(x’) – f(x*)  (b-a)Min (|f ‘(b)|, f ‘(a))  
6.8) Dire comment on peut tenter d’améliorer x’ en utilisant a et b.

3/4
On s’intéresse maintenant à une méthode itérative dite du gradient qui à chaque pas améliore
l’approximant xn en évoluant dans une direction d dans laquelle f diminue. Autrement dit on
prend xn+1 = xn + dn,  étant un paramètre positif. On peut alors, une fois qu’on a trouvé dn,
 soit minimiser f(xn+1 = xn + dn) par rapport à 
 soit se contenter de prendre  assez petit
6.9) Faites une proposition pour dn en utilisant le développement de Taylor de f(xn+1 = xn + dn)
au voisinage de xn
On considère maintenant la méthode dite de Newton qui consiste à remplacer localement la
fonction f par la parabole correspondant au développement limité à l’ordre 2.
6.10) Donner le développement limité de f(xn + ∆x) à l’ordre 2 ainsi que la valeur de ∆x qui le
minimise
6.11) Déduire un algorithme itératif de calcul d’une approximation de x*.
6.12) Rappeler le développement limité f(xn + ∆x, yn + ∆y) d’une fonction différentiable f de
deux variables x, y autour de (xn, yn).
6.13) Donner une condition simple paramétrée par un réel positif , pour que (xn + ∆x, yn +
∆y) soit une meilleure approximation que (xn, yn).
6.14) Proposer une méthode du gradient en dimension 2 pour la calcul d’une valeur
approchée du minimum d’une fonction différentiable.

4/4

Vous aimerez peut-être aussi