(* 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 ()))))