[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); } } Int fib(Int n) { if (length(fibs) >= n) { 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 }