Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的硬币兑换功能在包含在回忆录缓存中时不起作用?_Javascript_Recursion_Memoization_Coin Change - Fatal编程技术网

Javascript 为什么我的硬币兑换功能在包含在回忆录缓存中时不起作用?

Javascript 为什么我的硬币兑换功能在包含在回忆录缓存中时不起作用?,javascript,recursion,memoization,coin-change,Javascript,Recursion,Memoization,Coin Change,我正在尝试经典的,我下面的代码运行良好,例如,它返回正确的值3,硬币组合为[1,2,5],目标值为11。然而,当我将备忘录添加到递归调用时,它会给出一个错误的答案?我在函数调用中做错了什么 var coinChange = function(coins, amount, totalCoins = 0, cache = {}) { if (cache[amount] !== undefined) return cache[amount]; if (amount === 0) {

我正在尝试经典的,我下面的代码运行良好,例如,它返回正确的值3,硬币组合为[1,2,5],目标值为11。然而,当我将备忘录添加到递归调用时,它会给出一个错误的答案?我在函数调用中做错了什么

var coinChange = function(coins, amount, totalCoins = 0, cache = {}) {
    if (cache[amount] !== undefined) return cache[amount];
    if (amount === 0) {
        return totalCoins;
    } else if (0 > amount) {
        return Number.MAX_SAFE_INTEGER;
    } else {
        let minCalls = Number.MAX_SAFE_INTEGER;
        for (let i = 0; i < coins.length; i++) {
            let recursiveCall = coinChange(coins, amount - coins[i], totalCoins + 1, cache);
            minCalls = Math.min(minCalls, recursiveCall);
        }
        const returnVal = (minCalls === Number.MAX_SAFE_INTEGER) ? -1 : minCalls;
        return cache[amount] = returnVal;
    }
}

console.log(coinChange([1, 2, 5], 11)); // This ends up outputting 7!?!?!
var coinChange=function(coins,amount,totalCoins=0,cache={}){
如果(缓存[金额]!==未定义)返回缓存[金额];
如果(金额==0){
归还所有硬币;
}否则如果(0>金额){
返回Number.MAX\u SAFE\u整数;
}否则{
让minCalls=Number.MAX\u SAFE\u整数;
for(设i=0;i
您不应该将
totalCoins
作为递归调用的函数参数传递,因为这正是您试图计算的。相反,应按以下方式计算

var coinChange = function(coins, amount, cache = {}) {
    if (cache[amount] !== undefined) return cache[amount];
    if (amount === 0) {
        return 0;
    } else if (0 > amount) {
        return Number.MAX_SAFE_INTEGER;
    } else {
        let minCalls = Number.MAX_SAFE_INTEGER;
        for (let i = 0; i < coins.length; i++) {
            let recursiveCall = 1 + coinChange(coins, amount - coins[i], cache);
            minCalls = Math.min(minCalls, recursiveCall);
        }
        const returnVal = (minCalls === Number.MAX_SAFE_INTEGER) ? -1 : minCalls;
        return cache[amount] = returnVal;
    }
}

console.log(coinChange([1, 2, 5], 11)); // This outputs 3
let recursiveCall = 1 + coinChange(coins, amount - coins[i], cache);