import std.stdio;

ulong fib1(uint n)
{
    return n < 2 ? n : fib1(n - 1) + fib1(n - 2);
}

ulong fib2(uint n)
{
    ulong iter(uint i, ulong fib_1, ulong fib_2)
    {
        return i == n ? fib_2 : iter(i + 1, fib_1 + fib_2, fib_1);
    }
    return iter(0, 1, 0);
}

pure ulong fib3(uint n)
{
    ulong fib_1 = 1, fib_2 = 0;
    foreach (i; 0 .. n)
    {
        auto t = fib_1;
        fib_1 += fib_2;
        fib_2 = t;
    }
    return fib_2;
}

void main()
{
    writeln(fib3(40));
}
