let memo n f =
let rec g k
= match Hashtbl.find_opt h k
with Some v -> v
| None
-> let v
= f g k
in Hashtbl.add h k v
; v
in g
let rec f n =
let aux g = function
0 -> num_of_int 4
| 1 -> num_of_string "17/4"
| n -> (num_of_int 108) -/ (num_of_int 815) // g (n - 1) +/ (num_of_int 1500) // (g (n - 1) */ g (n - 2))
in memo n aux n
let (<<) f g x = f (g x)
let () =
println @@ f 0;
println @@ f 1;
println @@ f 2;
println @@ f 3;
println @@ f 80;
bGV0IG1lbW8gbiBmID0KICBsZXQgaCA9IEhhc2h0YmwuY3JlYXRlIG4gaW4KICBsZXQgcmVjIGcgayA9IG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgaCBrIHdpdGgKICAgICAgU29tZSB2IC0+IHYKICAgIHwgTm9uZSAtPiBsZXQgdiA9IGYgZyBrIGluIEhhc2h0YmwuYWRkIGggayB2OyB2CiAgaW4gZwpvcGVuIE51bQpsZXQgcmVjIGYgbiA9CiAgbGV0IGF1eCBnID0gZnVuY3Rpb24KICAgICAgMCAtPiBudW1fb2ZfaW50IDQKICAgIHwgMSAtPiBudW1fb2Zfc3RyaW5nICIxNy80IgogICAgfCBuIC0+IChudW1fb2ZfaW50IDEwOCkgLS8gKG51bV9vZl9pbnQgODE1KSAvLyBnIChuIC0gMSkgKy8gKG51bV9vZl9pbnQgMTUwMCkgLy8gKGcgKG4gLSAxKSAqLyBnIChuIC0gMikpCiAgaW4gbWVtbyBuIGF1eCBuCmxldCAoPDwpIGYgZyB4ID0gZiAoZyB4KQpsZXQgcHJpbnRsbiA9IHByaW50X25ld2xpbmUgPDwgcHJpbnRfc3RyaW5nIDw8IGFwcHJveF9udW1fZml4IDMwCmxldCAoKSA9CiAgcHJpbnRsbiBAQCBmIDA7CiAgcHJpbnRsbiBAQCBmIDE7CiAgcHJpbnRsbiBAQCBmIDI7CiAgcHJpbnRsbiBAQCBmIDM7CiAgcHJpbnRsbiBAQCBmIDgwOwo=