Skip to content

Instantly share code, notes, and snippets.

@DmxLarchey
Created February 24, 2024 22:39
La fonction "est une factorielle" en OCaml
let is_fact n =
let rec loop i n =
let (q,r) = (n / i, n mod i)
in not (r <> 0) && (q = 1 || loop (1+i) q)
in 0 < n && loop 1 n;;
@DmxLarchey
Copy link
Author

La variante suivante calcule l'inverse de la factorielle, c'est à dire renvoie la valeur Some i telle que fact i = n, si elle existe, et renvoie la valeur None sinon:

let which_fact n =
  let rec loop i n =
    let (q,r) = (n / i, n mod i)
    in if r <> 0 then None else
       if q = 1  then Some i
       else loop (1+i) q
  in if 0 < n then loop 1 n
     else None;;

Comme on ne calcule plus sur des booléens mais sur un type int option, le code est un peu moins compact mais c'est la même logique.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment