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