我正在考虑记忆,这简直让我感到困惑。我一直在努力研究这个例子,但我无法帮助但很清楚地理解它。这就是我想出来的。
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。我真的迷失了如何处理这个:(有什么帮助吗?
答案 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 )
需要一段时间。下一个(以及所有后续调用)执行得非常快。