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)
;;
C'est simplissime et suit directement l'énoncé.
Il y a quand même une vague astuce sur la condition d'arrêt.
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 Caml favorise l'écriture
à l'aide de fonctions récursives (ici terminales, le résultat est donné
par un appel récursif) 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 moche, pour le meilleur comme pour le pire, Caml n'est pas fait
pour écrire des boucles. Qu'on se le dise !