#include <iostream>

unsigned long long fib_iter(unsigned long long n)
{
    unsigned long long n1 = 0;
	unsigned long long n2 = 1;
	unsigned long long temp = 0;
	
	while ( --n )
	{
		temp = n2;
		n2 = n1 + n2;
		n1 = temp;
	}
	
	return n2;
}

unsigned long long fib_rek(unsigned long long n)
{
	if ( n <= 1 )
		return n;
	else
		return fib_rek(n-1) + fib_rek(n-2);
}

unsigned long long fib_tail_(unsigned long long n, unsigned long long f1, unsigned long long f2)
{
	if ( n == 0 )
		return f2;
	else
		return fib_tail_(n-1, f2, f1+f2);
}

unsigned long long fib_tail(unsigned long long n)
{
	return fib_tail_(n, 1, 0);
}

int main()
{
	std::cout << "Iter:     " << fib_iter(48) << std::endl;
	std::cout << "Rek_Tail: " << fib_tail(48) << std::endl;
	std::cout << "Rek:      " << fib_rek(48) << std::endl;
	
	return 0x0;
}