Fonction d'Ackermann - Ocaml

La fonction d'Ackermann est une fonction récursive terminale. Le langage de programmation OCaml se plit donc bien à ce genre d'exercices. Cet article présente différentes façons d'implémenter la fonction de Ackermann en OCaml.

Définition

Sans paraphraser Wikipédia ( page que vous pouvez retrouver ici), je vous rappelle la définition récursive de la fonction de Ackermann $\forall m,n \in \mathbb{N}$ :

  • $A(0,n) = n+1$
  • $A(m,0) = A(m-1,1)$
  • $A(m,n)=A(m-1,A(m,n-1))$

Implémentation en OCaml

Cet article étant destiné à un publique débutant en OCaml, je vous propose 3 façons d’implémenter la fonction d’Ackermann.

Première version

OCaml se prêtant bien aux fonctions récursives, l’implémentation de la fonction d’Ackermann est, à partir de la définition, plutôt directe :

let rec ackermann = function
  | 0, n -> n + 1
  | m, 0 -> ackermann (m - 1, 1)
  | m, n -> ackermann (m - 1, ackermann (m, n - 1));;
ackermann (3,4);;

Avec $m=3$ et $n=4$, nous avons bien 125 pour résultat.

Deuxième version

Vous pouvez également obtenir un résultat très similaire en utilisant un match.

let rec ackermann2 m n = 
  match m,n with
  | 0, n -> n + 1
  | m, 0 -> ackermann2 (m - 1) 1
  | m, n -> ackermann2 (m - 1) (ackermann2 (m) (n - 1));;
ackermann 3 4;;

Troisième version

Si vous préférer l’utilisation de if-then-else, je vous propose cette fonction :

let rec ackermann3 m n =
  if m = 0 then (n+1)
  else
    (if n = 0 then ackermann3 (m-1) 1
     else ackermann3 (m-1) (ackermann3 m (n-1)));;
ackermann3 3 4;;