请问有没有人能提供一个仅使用Javascript的简单记忆功能函数?我在谷歌上搜索时找到了一些文章,但是并没有很多关于这个的内容。我找到的最好的文章是这篇:http://alivedise.github.io/blog/2012/12/22/javascript-memorization/。我明白缓存是什么,但是这个例子对我来说太复杂了。我希望这里的任何人都可以提供一个简单的函数和调用,这样我就可以开始更深入地理解它了。谢谢。
这里有一篇不错的文章这里和另一个SO问题这里。记忆化是一种优化技术,主要用于通过让函数调用避免重复计算先前处理过的输入的结果来加速计算机程序。
var cachedResult;
function doHeavyCalculation()
{
if (typeof(cachedResult) !== 'undefined')
return cachedResult;
// no cached result available. calculate it, and store it.
cachedResult = /* do your computation */;
return cachedResult;
}
有一些支持记忆任何函数的JavaScript框架,它们基本上通过装饰一个函数为您提供可重用的样板代码。
var cache = {1:1, 2:1};
function fib(n) {
if(!cache[n]) // Have we already calculated this value?
cache[n] = fib(n - 1) + fib(n - 2) // Calculate and store it
return cache[n]
}
恐怕其他答案都使用全局变量,这是错误的。JavaScript 提供了更好的解决方案。请注意函数表达式后面的括号 ()。它意味着该函数立即执行,并且由该函数返回的结果(并分配给 memo 常量)是另一个函数,该函数进行计算本身,但可以使用已执行函数上下文中的变量缓存作为变量。缓存仅可由 memo 函数访问。
const memo = function () {
let cache = [];
return function (n) {
if (cache.includes(n)) { console.log("already in memory") }
else { console.log("first"); cache.push(n); }
}
}();
memo(7) //first
memo(7) //already in memory
memo(7) //already in memory
memo(1) //first
memo(1) //already in memory
keslert 的 Fibonacci 示例是一个很好的例子,这里再举一个使用编辑距离作为示例来帮助你理解。
// Map<string, Map<string, number>>
const cache = new Map();
// a: string, b: string
function editDistance(a, b) {
if (a.length === 0) {
return b.length;
}
if (b.length === 0) {
return a.length;
}
let res = cache.getMap(a).get(b);
if (res !== undefined) {
return res;
}
res = Math.min(
editDistance(pop(a), pop(b)) + (last(a) === last(b) ? 1 : 0)
, editDistance(pop(a), b) + 1
, editDistance(a, pop(b)) + 1
);
cache.getMap(a).set(b, res);
return res;
}