如何创建memoize功能

5 javascript memoization underscore.js

我对这个memoize问题很难过.我需要创建一个函数来检查是否已经为给定参数计算了值,返回先前的结果,或者运行计算并返回该值.

我花了好几个小时,而我是JS的新手.我无法理解如何做到这一点.我不能使用任何内置函数,并且真的想了解我需要做什么.

这是我到目前为止所做的,这是错误的,在这一点上感觉像伪代码.我已经在这里搜索了现有的memoize问题,但我似乎无法使任何解决方案工作.任何帮助深表感谢.

  myMemoizeFunc = function(passedFunc) {
  var firstRun = passedFunc;
  function check(passedFunc){
    if(firstRun === undefined){
        return passedFunc;
    }else{return firstRun;}
  }
  };
Run Code Online (Sandbox Code Playgroud)

对不起,我应该更清楚了.以下是我的具体要求:myMemoizeFunc必须返回一个函数,该函数将检查是否已经为给定的arg计算了计算,并在可能的情况下返回该val.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;
        }
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

我不应该在这里返回i或者传递函数,但是在检查值时我还能在if/else中做什么呢?我一直在关注这个问题,我开始实现的代码非常荒谬,需要一些新的建议.

Pet*_*son 8

我认为这样做的主要技巧是创建一个对象,该对象存储之前传入的参数作为键,函数的结果作为值.

对于单个参数的memoizing函数,我会像这样实现它:

var myMemoizeFunc = function (passedFunc) {
    var cache = {};
    return function (x) {
        if (x in cache) return cache[x];
        return cache[x] = passedFunc(x);
    };
};
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它来记忆任何带有单个参数的函数,例如,用于计算阶乘的递归函数:

var factorial = myMemoizeFunc(function(n) {
    if(n < 2) return 1;
    return n * factorial(n-1);
});
Run Code Online (Sandbox Code Playgroud)

  • 如果您有多个参数,您将如何缓存它? (2认同)