Son type est : (’a -> ’a) -> ’a -> int -> ’a.
Les fonctions pr´ec´edentes peuvent alors s’´ecrire :
let puissance a = it`ere (function x -> a*x) 1 ;;
let fact n =
let (_,result) = it`ere (function (x,y) -> (x+1,(x+1)*y)) (0,1) n
in result ;;
Notons que la fonction it`ere est d´efinie par un algorithme r´ecursif. Ceci permet, conjointement au th´eor`eme cit´e au
d´ebut de ce texte, d’´enoncer le r´esultat suivant :
Tout algorithme utilisant une boucle index´ee poss`ede une version r´ecursive.
Pour obtenir la version r´ecursive d’un algorithme utilisant une boucle index´ee, il suffit donc de d´eterminer l’it´erateur
associ´e `a cette boucle. Par exemple, on obtiendra pour les deux fonctions pr´ec´edentes :
let rec puissance a = function
0 -> 1
| n -> a * puissance a (n-1) ;;
let rec fact = function
0 -> 1
| n -> n * fact (n-1) ;;
2. Boucles conditionnelles
On peut d´egager deux types de boucles conditionnelles :
– tant que la condition est v´erifi´ee, effectuer le corps de la boucle ;
– effectuer le corps de la boucle jusqu’`a ce que la condition soit v´erifi´ee.
Dans le premier cas, la condition est une condition d’entr´ee, dans le deuxi`eme cas, une condition de sortie.
Une boucle du premier type peut ne pas ex´ecuter le corps de la boucle (si la condition n’est pas v´erifi´ee en entr´ee). Par
contre, une boucle du deuxi`eme type va effectuer au moins une fois le corps de la boucle avant de tester la condition.
Seul le premier type est impl´ement´e par Caml suivant la syntaxe : while condition do s´equence d’instructions done.
`
A l’instar des boucles index´ees, une boucle conditionnelle se ram`ene `a une it´eration. De ce fait, on peut ´ecrire une
fonction tant_que g´en´erique de la mani`ere suivante :
let rec tant_que cond f u = match (cond u) with
true -> tant_que cond f (f u)
| false -> u ;;
Il s’agit d’une fonction de type (’a -> bool) -> (’a -> ’a) -> ’a -> ’a. Elle retourne le premier ´el´ement de la
suite (un)n∈Nd´efinie par u0=u
un+1 =f(un)ne v´erifiant pas la condition. On peut donc ´enoncer :
Tout algorithme utilisant une boucle conditionnelle poss`ede une version r´ecursive.
Remarque. On peut proc´eder de la mˆeme mani`ere pour le deuxi`eme type de boucle conditionnelle, `a partir de
l’it´erateur g´en´erique suivant :
let r´ep`ete cond f u = tant_que (function b -> not cond b ) f (f u) ;;
•Preuve de validit´e d’un algorithme
D´emontrer la validit´e d’un algorithme utilisant une boucle index´ee ou conditionnelle consiste `a d´eterminer l’it´erateur
(un)n∈Nassoci´e `a cette boucle : on extrait de l’algorithme la valeur de u0ainsi que la relation de r´ecurrence :
uk+1 =f(uk), ce qui permet ensuite d’en d´eduire le r´esultat de l’algorithme, `a savoir un(la d´etermination de la suite
(un)n∈Nest ce qu’on appelle un invariant de boucle).
page 2