【发布时间】:2014-08-20 18:00:04
【问题描述】:
我读过
http://www.sitepoint.com/implementing-memoization-in-javascript/
自动记忆
在前面的所有示例中,函数都经过显式修改以添加记忆功能。也可以在完全不修改功能的情况下实现记忆化基础设施。这很有用,因为它允许功能逻辑与记忆逻辑分开实现。这是通过创建一个实用函数来完成的,该函数将函数作为输入并对其应用记忆。以下 memoize() 函数将函数“func”作为输入。 memoize() 返回一个新函数,该函数将缓存机制包装在“func”周围。请注意,此函数不处理对象参数。为了处理对象,需要一个循环来单独检查每个参数并根据需要进行字符串化。
function memoize(func) {
var memo = {};
var slice = Array.prototype.slice;
return function() {
var args = slice.call(arguments);
if (args in memo)
return memo[args];
else
return (memo[args] = func.apply(this, args));
}
}
使用这个,我做到了
var fib = function(n)
{
if (n <= 1)
{
return 1; // as the Fib definition in Math
}
else
{
return fib(n - 2) + fib(n - 1); // as the Fib definition in Math
}
};
log(memoize(fib)(43));
log(fib(43));
但是,我确认没有效果。
我也出于同样的目的尝试了一个 npm 库,
https://github.com/medikoo/memoize
和
var memoize = require('memoizee');
log(memoize(fib)(43));
log(fib(43));
结果,一样。
我错过了什么,以及如何修复并使其正常工作?
谢谢!
编辑
require('memoizee');
var fib = function(n)
{
if (n <= 1)
{
return 1; // as the Fib definition in Math
}
else
{
return fib(n - 2) + fib(n - 1); // as the Fib definition in Math
}
};
var generator = function(f)
{
return memoize(f);
};
var _fib = generator(fib);
console.log(_fib(40)); //no effect
【问题讨论】:
-
从您发布的内容来看,只有第一个调用使用了 memoize-d 函数。递归调用都使用原来的
fib函数。 -
哦,当然。我明白了。想着怎么修。谢谢
标签: javascript node.js memoization