在JavaScript中实现自动记忆(返回一个关闭的函数)

时间:2014-06-30 11:13:56

标签: javascript node.js memoization

我已经阅读了

http://www.sitepoint.com/implementing-memoization-in-javascript/

自动记忆

  

在前面的所有示例中,显式修改了函数以添加memoization。也可以在不修改功能的情况下实现存储器基础结构。这很有用,因为它允许函数逻辑与memoization逻辑分开实现。这是通过创建一个实用程序函数来完成的,该函数将函数作为输入并对其应用memoization。以下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

1 个答案:

答案 0 :(得分:1)

memoize调用不会改变fib函数,但会返回其新的备忘对应函数。在您的代码中,您只需调用一次,原始的fib将在下次调用。您需要创建一个 memoized&#34; wrapper&#34;,然后调用多个次:

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

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