在JavaScript中实现自动记忆(返回闭包函数)



我读过

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调用不会改变fib函数,而是返回其新的、记忆的对应函数。在您的代码中,您只调用一次,下一次调用原始的fib函数。您需要创建一个记忆的"包装器",并多次调用:

var mFib = memoize(fib);
log(mFib(43));
log(mFib(43));

您还可以覆盖原来的fib = memoize(fib);,这将具有额外的好处,即递归调用(这是有趣的调用)也将被记忆。

最新更新