#!/usr/bin/ruby

func fib_iter(n) {
    var fib = [1, 1];
    { fib = [fib[-1], fib[-2] + fib[-1]] } \
        * (n - fib.len);
    return fib[-1];
}

func fib_rec(n) {
    n < 2 ? n : (__FUNC__(n-1) + __FUNC__(n-2));
}

func fib_mem (n) {
    static c = [];
    n < 2 && return n;
    c[n] := (__FUNC__(n-1) + __FUNC__(n-2));
}

var a = fib_iter(12)
var b = fib_rec(12)
var c = fib_mem(35)

say "fib(12) = #{a}"
say "fib(35) = #{c}"

assert_eq(a, 144)
assert_eq(b, a)
assert_eq(c, 9227465)