/* Бърз рекурсивен линеен вариант, запаметяващ вече пресметнатото */ unsigned long fibMemo(unsigned n) { if (n < 2) m[n] = n; else if (0 == m[n]) m[n] = fibMemo(n - 1) + fibMemo(n - 2); return m[n]; }
MEMOIZED_FUNCT(SOME_MEMOIZATION_CONTEXT, int, fibMemo,int, a) /* int fibMemo(int a) */ { if (a == 0 || a == 1 || a < 0){ return 1;} else{ return fibMemo(a-1) + fibMemo(a-2);} }
int fibMemo(int n, int *memo) { if (memo[n] != 0) { return memo[n]; } if (n == 0 || n == 1) { memo[n] = n; return n; } int res = fibMemo(n-1, memo) + fibMemo(n-2, memo); memo[n] = res; return res; }
int fib(int n) { if (n < 0) { return 0; } int *memo = calloc(n+1, sizeof(int)); int res = fibMemo(n, memo); free(memo); return res; }
int main(int argc, char *argv[]) { initGlobalMemoizationContexts(); enableGlobalMemoizationContext(SOME_MEMOIZATION_CONTEXT); printf ("F 50 is %d\n", fibMemo(40)); disableGlobalMemoizationContext(SOME_MEMOIZATION_CONTEXT); freeGlobalMemoizationContexts(); return 0; }
int main(void) { memset(m, 0, MAX * sizeof(*m)); printf("\n%u-тото число на Фибоначи е: %lu", n, fibMemo(n)); return 0; }