我对这个memoize问题很难过。我需要创建一个函数来检查是否已经为给定参数计算了值,返回先前的结果,或者运行计算并返回该值。
我花了好几个小时,而我是JS的新手。我无法理解如何做到这一点。我不能使用任何内置函数,并且真的想了解我需要做什么。
到目前为止,这是我所拥有的,在这一点上感觉像伪代码是错误的。我已经在这里搜索了现有的memoize问题,但我似乎无法使任何解决方案工作。非常感谢任何帮助。
myMemoizeFunc = function(passedFunc) {
var firstRun = passedFunc;
function check(passedFunc){
if(firstRun === undefined){
return passedFunc;
}else{return firstRun;}
}
};
对不起,我应该更清楚了。以下是我的具体要求: myMemoizeFunc必须返回一个函数,该函数将检查是否已经为给定的arg计算了计算,并在可能的情况下返回该值。 passedFunc是一个保存计算结果的函数。 我明白这可能看起来像是重复的,但我并不是这样,因为我在理解我应该做什么方面有一些严重的困难,需要比其他帖子更多的帮助。 这就是我的思维过程带给我的目标,但我又离开了。
myMemoizeFunc = function(passedFunc) {
var allValues = [];
return function(){
for(var i = 0; i < myValues.length; i++){
if(myValues[i] === passedFunc){
return i;
}
else{
myValues.push(passedFunc);
return passedFunc;
}
}
}
};
我不应该在这里返回i或者传递函数,但是在检查值时我还能在if / else中做什么?我一直在研究这个问题,我开始实现的代码非常荒谬,需要一些新的建议。
答案 0 :(得分:8)
我认为这样做的主要技巧是创建一个对象,该对象存储以前作为键传递的参数,并将函数的结果作为值。
对于单个参数的memoizing函数,我会像这样实现它:
var myMemoizeFunc = function (passedFunc) {
var cache = {};
return function (x) {
if (x in cache) return cache[x];
return cache[x] = passedFunc(x);
};
};
然后你可以使用它来记忆任何带有单个参数的函数,例如,用于计算阶乘的递归函数:
var factorial = myMemoizeFunc(function(n) {
if(n < 2) return 1;
return n * factorial(n-1);
});
答案 1 :(得分:0)
有许多可用的memoization库。有效地进行记忆并不像看起来那么简单。我建议使用一个库。最快的两个是:
答案 2 :(得分:0)
请参阅此处,以了解记忆库的完整列表:https://stackoverflow.com/a/61402805/2441655