#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdW5zaWduZWQgbG9uZyBsb25nIGZpYl9pdGVyKHVuc2lnbmVkIGxvbmcgbG9uZyBuKQp7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgbjEgPSAwOwoJdW5zaWduZWQgbG9uZyBsb25nIG4yID0gMTsKCXVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wID0gMDsKCQoJd2hpbGUgKCAtLW4gKQoJewoJCXRlbXAgPSBuMjsKCQluMiA9IG4xICsgbjI7CgkJbjEgPSB0ZW1wOwoJfQoJCglyZXR1cm4gbjI7Cn0KCnVuc2lnbmVkIGxvbmcgbG9uZyBmaWJfcmVrKHVuc2lnbmVkIGxvbmcgbG9uZyBuKQp7CglpZiAoIG4gPD0gMSApCgkJcmV0dXJuIG47CgllbHNlCgkJcmV0dXJuIGZpYl9yZWsobi0xKSArIGZpYl9yZWsobi0yKTsKfQoKdW5zaWduZWQgbG9uZyBsb25nIGZpYl90YWlsXyh1bnNpZ25lZCBsb25nIGxvbmcgbiwgdW5zaWduZWQgbG9uZyBsb25nIGYxLCB1bnNpZ25lZCBsb25nIGxvbmcgZjIpCnsKCWlmICggbiA9PSAwICkKCQlyZXR1cm4gZjI7CgllbHNlCgkJcmV0dXJuIGZpYl90YWlsXyhuLTEsIGYyLCBmMStmMik7Cn0KCnVuc2lnbmVkIGxvbmcgbG9uZyBmaWJfdGFpbCh1bnNpZ25lZCBsb25nIGxvbmcgbikKewoJcmV0dXJuIGZpYl90YWlsXyhuLCAxLCAwKTsKfQoKaW50IG1haW4oKQp7CglzdGQ6OmNvdXQgPDwgIkl0ZXI6ICAgICAiIDw8IGZpYl9pdGVyKDQ4KSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgIlJla19UYWlsOiAiIDw8IGZpYl90YWlsKDQ4KSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgIlJlazogICAgICAiIDw8IGZpYl9yZWsoNDgpIDw8IHN0ZDo6ZW5kbDsKCQoJcmV0dXJuIDB4MDsKfQ==