(* Cálculo do n-ésimo número da sequência de perrin, versão com recursão terminal, 
   tendo por base a definição original da sequência.
   Para tal, são necessários três acumuladores  *)

(* compilation : ocamlopt nums.cmxa perrin_rect.ml -o perrin_rect *)

open  Num

let max = Int 1000000000
    
let perrin n =
  let rec perrin_term  acc1 acc2 acc3 = function
      (Int 0) -> acc1
    | (Int 1) -> acc2
    | (Int 2) -> acc3
    | n -> perrin_term acc2 acc3 (acc2+/acc1) (n -/ (Int 1))
  in if n < Int 0 || n > max then failwith "Argumento inválido"
     else perrin_term (Int 3) (Int 0) (Int 2) n

let () = print_endline (string_of_num (perrin (Int (read_int ()))))

This document was generated using caml2html