var fibonacci = function () { var memo = [0,1]; var fib = function (n) { var result = memo[n]; if (typeof result !== 'number') { result = fib (n-1) + fib (n-2); memo[n] = result; } return result; }; return fib; }(); for( var i=0; i <= 10; i++) { console.log('//' + i + ':' + fibonacci (i)); }
这个函数返回了同样的结果,但调用自身的次数大为减少,仅仅是为了去取得存储。
我们可以将这种技术推而广之,编写一个函数来帮助我们来构造带记忆功能的函数。如下:memoizer 函数取得一个初始的 memo 数组和 formula 函数。它返回一个管理 memo 存储和在需要时间调用 formula 函数的 recur 函数。我们把这个 recur 函数和它的参数传递给 formula 函数。
1 2 3 4 5 6 7 8 9 10 11
var memoizer = function (memo,formula) { var recur = function (n) { var result = memo[n]; if (typeof result !== 'number') { result = formula (recur,n); memo[n] = result; } return result; }; return recur; }
var factorial = memoizer([1,1],function (recur,n) { return n * recur (n-1); })
完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var memoizer = function (memo,formula) { var recur = function (n) { var result = memo[n]; if (typeof result !== 'number') { result = formula (recur,n); memo[n] = result; } return result; }; return recur; }; var factorial = memoizer([1,1],function (recur,n) { return n * recur (n-1); }); for( var i=0; i <= 10; i++) { console.log('//' + i + ':' + factorial (i)); }