let rec f n =
let a
= Array.make
(n
+ 1) None
in let (<<) i x = a.(i) <- Some x; x in
let rec g n = match a.(n), n with
Some x, _ -> x
| _, 0 -> 0 << num_of_int 4
| _, 1 -> 1 << num_of_string "17/4"
| _, n -> n << (num_of_int 108) -/ (num_of_int 815) // g (n - 1) +/ (num_of_int 1500) // (g (n - 1) */ g (n - 2))
in g n
let (<<) f g x = f (g x)
let () =
println @@ f 0;
println @@ f 1;
println @@ f 2;
println @@ f 3;
println @@ f 80;
b3BlbiBOdW0KbGV0IHJlYyBmIG4gPQogIGxldCBhID0gQXJyYXkubWFrZSAobiArIDEpIE5vbmUgaW4KICBsZXQgKDw8KSBpIHggPSBhLihpKSA8LSBTb21lIHg7IHggaW4KICBsZXQgcmVjIGcgbiA9IG1hdGNoIGEuKG4pLCBuIHdpdGgKICAgICAgU29tZSB4LCBfIC0+IHgKICAgIHwgXywgMCAtPiAwIDw8IG51bV9vZl9pbnQgNAogICAgfCBfLCAxIC0+IDEgPDwgbnVtX29mX3N0cmluZyAiMTcvNCIKICAgIHwgXywgbiAtPiBuIDw8IChudW1fb2ZfaW50IDEwOCkgLS8gKG51bV9vZl9pbnQgODE1KSAvLyBnIChuIC0gMSkgKy8gKG51bV9vZl9pbnQgMTUwMCkgLy8gKGcgKG4gLSAxKSAqLyBnIChuIC0gMikpCiAgaW4gZyBuCmxldCAoPDwpIGYgZyB4ID0gZiAoZyB4KQpsZXQgcHJpbnRsbiA9IHByaW50X25ld2xpbmUgPDwgcHJpbnRfc3RyaW5nIDw8IGFwcHJveF9udW1fZml4IDMwCmxldCAoKSA9CiAgcHJpbnRsbiBAQCBmIDA7CiAgcHJpbnRsbiBAQCBmIDE7CiAgcHJpbnRsbiBAQCBmIDI7CiAgcHJpbnRsbiBAQCBmIDM7CiAgcHJpbnRsbiBAQCBmIDgwOwogIA==