javascript 中的记忆以防止重复

Memoization in javascript to prevent repeat

我正在研究记忆,这让我很困惑。我一直在努力研究这个例子,但我忍不住很清楚地理解它。这是我想出来的。

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) 的再次出现,但仍然计算 return 结果,即 17。我真的不知道如何接近这个 :( 有什么帮助吗?

这是一个非常基本的记忆功能:

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

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

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

这是一个例子:

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

var mem = memoize( slow );

mem( 10 );
mem( 10 );

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