[Int] fibs := [1,1]; Int length([Int] xs) { if (xs.nil) { return 0; } else { return 1 + length(xs.tl); } } Int get([Int] xs, Int i) { if (i == 0) { return xs.hd; } else { return get(xs.tl, i-1); } } [Int] append([Int] xs, [Int] ys) { if (xs.nil) { return ys; } else { return xs.hd : append(xs.tl, ys); } } Bool gt(Int x, Int y) { if (x == 0) { return False; } else if (y == 0) { return True; } else { return gt(x-1, y-1); } } Int fib(Int n) { if (gt(length(fibs), n - 1)) { return get(fibs, n - 1); } else { Int fn := fib(n-1) + fib(n-2); fibs := append(fibs, [fn]); return fn; } } Int main() { return fib(92); // Largest to fit in a 64-bit integer }