(* versão com memoização baseada numa tabela de hash, e uso dos big_ints *) (*compilation: ocamlopt nums.cmxa perrin_hash.ml -o perrin_hash *) open Big_int open Hashtbl let zero = big_int_of_int 0;; let one = big_int_of_int 1;; let two = big_int_of_int 2 ;; let three = big_int_of_int 3;; let ( ++ ) = add_big_int;; let ht = create 97;; let rec perrin n = match n with 0 -> three 1 -> zero 2 -> two m when m<0 -> failwith "Argumento inválido" _ -> try find ht n with Not_found -> let n2 = perrin (n-2) in let n3 = perrin (n-3) in let res = (n2 ++ n3) in (Hashtbl.add ht n res; res) let () = print_endline (string_of_big_int (perrin (read_int ())))
This document was generated using caml2html