【问题标题】:Memoization in javascript to prevent repeatjavascript中的记忆以防止重复
【发布时间】:2015-02-18 03:12:15
【问题描述】:

我正在研究记忆,它只是让我感到困惑。我一直在尝试处理这个例子,但我不禁非常清楚地理解它。这就是我想出的。

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("计算平方 " + x);返回 x * x; }

msq = memoize(正方形)

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

它是显示:计算平方 2,然后计算平方 3。它忽略了 msq(2) 的再次出现,但仍然计算返回结果,即 17。我真的不知道如何处理这个:( 任何帮助?

【问题讨论】:

  • 顺便说一句:您的函数根本不会忽略 msq(2) 的再次出现。它第二次调用它。你的 memoize 函数所做的只是创建一个名为 check 的新函数,对它完全不做任何事情,然后返回调用 memoize 的确切原始函数。
  • 这并不是一个特别有建设性的评论。也许尝试提供一个答案来解释正确的记忆功能应该如何工作?

标签: javascript memoization


【解决方案1】:

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

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

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

当你调用 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 ) 需要一些时间。下一个(以及所有后续调用)执行得非常快。

【讨论】:

  • TYBG,很有意义:)
猜你喜欢
  • 2012-12-03
  • 1970-01-01
  • 2022-01-17
  • 2016-07-10
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
相关资源
最近更新 更多