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) ;; |
Une lecture rapide de l'énoncé suggère:
let rec pgcd u v = if v = 0 then u else let r = u mod v in if r = 0 then u else pgcd v r ;; |
Toutefois, il y a quand même une vague astuce sur la condition d'arrêt pour éviter deux tests successifs.
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 !