Skip to content

Instantly share code, notes, and snippets.

@DmxLarchey
Created February 24, 2024 22:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DmxLarchey/10dc90f60636392798a0c845dc0d0894 to your computer and use it in GitHub Desktop.
Save DmxLarchey/10dc90f60636392798a0c845dc0d0894 to your computer and use it in GitHub Desktop.
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