gpt4 book ai didi

javascript - 函数 Memo 对于不同的参数应该给出不同的结果

转载 作者:行者123 更新时间:2023-12-03 02:57:30 26 4
gpt4 key购买 nike

我正在创建一个函数备忘录,返回一个函数,该函数在调用时将检查它是否已经计算出给定参数的结果,并在可能的情况下返回该值。

现在我的 key 仅包含作为我的 key 传入的第一个参数,以检查该函数是否已经运行。

const memo = function(func) {
const memoizedFunc = function () {
let result;
if (memoizedFunc.cache[arguments[0]] !== undefined) {
result = memoizedFunc.cache[arguments[0]];
} else {
result = func.apply(null, arguments);
memoizedFunc.cache[arguments[0]] = result;
}
return result;
}
memoizedFunc.cache = {};
return memoizedFunc;
};

因此,如果我们使用测试函数运行它:

function memoAdd(num1, num2){
return num1 + num2;
}

memo(memoAdd(1, 2)));
memo(memoAdd(1, 3))); // -> since it's the first argument that we use as
// the key, it will still pull up 3 as the answer even if the answer should
// be four

知道我应该如何解决这个问题,以便针对不同的参数给出不同的结果吗?

最佳答案

您的测试调用将失败,因为它没有将可调用对象传递给备忘录,而是传递函数的结果。

如果想法是避免重复计算并仅返回相同的结果,您可以这样做:

var function_cache = {};
const memo1 = function(f, args) {
var sig = JSON.stringify(args);
if (f.cache == undefined) {
f.cache = {};
}
if (f.cache[sig] !== undefined) {
console.log('Value from Cache');
return f.cache[sig];
}
console.log('Value from Computation');
f.cache[sig] = f.apply(null, args);
return f.cache[sig];
}

function memoAdd(num1, num2){
return num1 + num2;
}

console.log(memo1(memoAdd, [1, 2]));
console.log(memo1(memoAdd, [1, 3]));
console.log(memo1(memoAdd, [1, 2]));
console.log(memo1(memoAdd, [1, 3]));

在这种情况下,哈希cache被添加到传递的函数中,并且参数通过JSON.stringify转换为字符串签名 - 用于查找先前的值和返回它。

如果您的目标是拥有一个可以执行此操作的可调用函数,这样您就不需要每次都将其包装在备忘录中,您可以对此进行调整:

const memo2 = function(f) {
if (f.cache == undefined) {
f.cache = {};
}

const newFunc = function() {
var sig = JSON.stringify(arguments);
if (f.cache[sig] !== undefined) {
console.log('Value from Cache');
return f.cache[sig];
}
console.log('Value from Computation');
f.cache[sig] = f.apply(null, arguments);
return f.cache[sig];
}
return newFunc;
}

function memoAdd(num1, num2){
return num1 + num2;
}

var myFunc = memo2(memoAdd);
console.log(myFunc(1,2));
console.log(myFunc(1,3));
console.log(myFunc(1,2));
console.log(myFunc(1,3));

在这种情况下,传入的函数被闭包锁定,我们仍然将结果缓存在 f.cache 中。

关于javascript - 函数 Memo 对于不同的参数应该给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47553507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com