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中做什么呢?我一直在关注这个问题,我开始实现的代码非常荒谬,需要一些新的建议.
我认为这样做的主要技巧是创建一个对象,该对象存储之前传入的参数作为键,函数的结果作为值.
对于单个参数的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)
| 归档时间: |
|
| 查看次数: |
5241 次 |
| 最近记录: |