C/C++ 使用 memoization 优化算法 #include <stdio.h> #define COUNT_TIMES 10 int fib(int n) { if (n == 0 || n == 1) { return 1; } else { return fib(n - 2) + fib(n - 1); } } int main() { int i; for (i = 0; i < COUNT_TIMES; i++) printf("fib %d\n", fib(i)); }
#include <stdio.h> #define COUNT_TIMES 10 int count; int fib(int n) { if (n == 0 || n == 1) { return 1; } else { count++; return fib(n - 2) + fib(n - 1); } } int main() { int i, *mem; for (i = 0; i < COUNT_TIMES; i++) { printf("n %d 结果 %2d 计算次数 %d\n", i, fib(i), count); count = 0; } }
#include <stdio.h> #include <stdlib.h> #define COUNT_TIMES 10 int count; int fib(int n, int *mem) { // 如果没有缓存结果则进行计算,并把结果加入到缓存中 if (mem[n] == -1) { mem[n] = fib(n - 1, mem) + fib(n - 2, mem); // 统计计算次数 count++; } // 返回缓存结果 return mem[n]; } int main() { int i, j, *mem; for (i = 0; i < COUNT_TIMES; i++) { // 申请一块内存来缓存结果 mem = (int *)malloc(sizeof(int) * COUNT_TIMES); // 初始化其中的结果 mem[0] = mem[1] = 1; for (j = 2; j < COUNT_TIMES; j++) mem[j] = -1; // 调用计算 printf("n %d 结果 %2d 计算次数 %d\n", i, fib(i, mem), count); count = 0; // 计算次数清零 free(mem); // 释放用来缓存的内存 } }
#include <stdio.h> #include <stdlib.h> #define COUNT_TIMES 10 int * init_mem() { int i, *mem; mem = (int *)malloc(sizeof(int) * COUNT_TIMES); mem[0] = mem[1] = 1; for (i = 2; i < COUNT_TIMES; i++) mem[i] = -1; return mem; } int fib(int n, int *mem) { if (mem[n] == -1) mem[n] = fib(n - 1, mem) + fib(n - 2, mem); return mem[n]; } int main() { int i, *mem; for (i = 0; i < COUNT_TIMES; i++) { mem = init_mem(); printf("fib %d\n", fib(i, mem)); free(mem); } }
int fib ( n ) { if ( n == 0 || n == 1 ) { return 1; } else { return fib( n - 2 ) + fib ( n - 1 ); } }
int calc_fib ( int n ) { int val[ n ] , i; for ( i = 0; i <=n; i++ ) { val[ i ] = -1; // Value of the first n + 1 terms of the fibonacci terms set to -1 } val[ 0 ] = 1; // Value of fib ( 0 ) is set to 1 val[ 1 ] = 1; // Value of fib ( 1 ) is set to 1 return fib( n , val ); } int fib( int n , int* value ) { if ( value[ n ] != -1 ) { return value[ n ]; // Using memoization } else { value[ n ] = fib( n - 2 , value ) + fib ( n - 1 , value ); // Computing the fibonacci term } return value[ n ]; // Returning the value }
#include <iostream> #include <algorithm> #include <iterator> using namespace std; int fib(int n,int val[]) { if(val[n]!=-1) return val[n]; else { val[n]=fib(n-1,val)+fib(n-2,val); return val[n]; } } void cal_fib(int n) { int *val=new int[n+1]; for(int i=0;i<=n;i++) val[i]=-1; val[0]=0; val[1]=1; fib(n,val); copy(val,val+n+1,ostream_iterator<int>(cout," ")); cout<<endl; delete[] val; } int main() { for(int i=3;i<=15;i++) cal_fib(i); }
// 常规代码 function fib(n) { if (n < 2) { return n; } return fib(n-1) + fib(n-2); }
// 优化后的代码 var mFib = function() { var cache = [1, 1]; // 裴波拉契数的前两个数为1, 1 return function(m) { var len = cache.length, i = len; // 如果m大于cache的长度, 则说明m对应的裴波拉契数不存在, 需要计算 if (m > len) { // 当i等于m的时候, 小于i之前的裴波拉契数已经计算过了, 可以直接使用 // 有的例子用的for循环, 但while循环更快 while (i <= m) { // 裴波拉契数的特点, 后一个数等于前两个数之和 // 把计算结果缓存起来, 避免再次计算 cache[i] = cache[i - 2] + cache[i - 1]; i++; } } // 当裴波拉契数存在时, 直接使用 return cache[m - 1]; } }();
|