如何创建memoize功能

时间:2015-05-22 01:22:55

标签: javascript underscore.js memoization

我对这个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中做什么?我一直在研究这个问题,我开始实现的代码非常荒谬,需要一些新的建议。

3 个答案:

答案 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库。有效地进行记忆并不像看起来那么简单。我建议使用一个库。最快的两个是:

https://github.com/anywhichway/iMemoized

https://github.com/planttheidea/moize

答案 2 :(得分:0)

请参阅此处,以了解记忆库的完整列表:https://stackoverflow.com/a/61402805/2441655