Le fichier pgcd.ml donne une solution, dont est extraite la
fonction pgcd suivante :
let rec pgcd u v =
if v = 0 then
u
else
pgcd v (u mod v)
;; |
Du point de vue du langage, on remarque que les fonctions ne sont pas
récursives par défaut : il faut introduire une fonction récursive par
let rec.
On remarque aussi que OCaml favorise l'écriture
à l'aide de fonctions récursives (ici terminales, i.e.
l'appel récursif est la dernière chose que l'on fait dans le corps de
la fonction) par rapport aux boucles.
Comparons avec un codage plus traditionnel à l'aide d'une boucle
while.
let pgcd u v =
let ur = ref u and vr = ref v in
while !vr <> 0 do
let x = !vr in
vr := !ur mod !vr ;
ur := x
done ;
!ur
|
C'est moins élégant, en particulier car c'est plus éloigné de la description
initiale de l'algorithme. C'est d'autre part légèrement plus
inefficace que la version récursive, les références introduisant une
indirection.