#include<stdio.h>
#define N 45
unsigned long fibo(unsigned long l)
{
if (l == 0)
return 0;
if (l == 1)
return 1;
return fibo(l - 1) + fibo(l - 2);
}
void phi(unsigned long* l1, unsigned long* l2)
{
unsigned long temp;
temp = *l1;
*l1 += *l2;
*l2 = temp;
}
void applyF(void (*f)(unsigned long*, unsigned long*),
int n, unsigned long* l1, unsigned long* l2)
{
if (n > 0)
{
f(l1, l2);
applyF(f, n-1, l1, l2);
}
}
unsigned long fastFibo(unsigned long l)
{
unsigned long l1 = 1, l2 = 0;
applyF(phi, l, &l1, &l2);
return l2;
}
int main()
{
unsigned long l;
for(l = 0 ; l <= N ; l++)
printf("%lu = %lu\n", l, fibo(l));
for(l = 0 ; l <= N ; l++)
printf("%lu = %lu\n", l, fastFibo(l));
return 0;
}