在javascript中进行memoization以防止重复

时间:2015-02-18 03:12:16

标签: javascript memoization

我正在考虑记忆,这简直让我感到困惑。我一直在努力研究这个例子,但我无法帮助但很清楚地理解它。这就是我想出来的。

function memoize(x) {
    //var x = [] 
    check = function() { 
    return copycat(x,x)
 }
   return x;
}

function copycat(input,output) {
   if (input === input || output === output) {
   return ""
   }
}

目标是将这3行输入我浏览器的控制台:

  

function square(x){alert(" computed sq" + x); return x * x; }

     

msq = memoize(square)

     

msq(2)+ msq(2)+ msq(3)

显示:计算平方2然后计算平方3.它忽略了msq(2)的重新执行但仍然计算返回结果,即17。我真的迷失了如何处理这个:(有什么帮助吗?

1 个答案:

答案 0 :(得分:3)

这是一个非常基本的memoize函数:

function memoize( fn ) {
  var cache = {};
  return function( arg ) {
    if ( !cache[ arg ] ) {
      cache[ arg ] = fn( arg );
    }
    return cache[ arg ];
  }
}

这可以通过接受一个函数并返回一个可以在其位置调用的 new 函数来实现。

当你调用memoized版本时,它会检查它是否有保存的结果。如果是,它将返回它。否则,它将运行您的原始函数,保存结果,然后返回它。

以下是一个例子:

function slow( n ) {
  for ( var i = 0; i < 1e9; ++i ) {
    i;
  }
  return n * n;
}

var mem = memoize( slow );

mem( 10 );
mem( 10 );

如果您在控制台中使用它,您会注意到第一次调用mem( 10 )需要一段时间。下一个(以及所有后续调用)执行得非常快。