我正在尝试经典的coin change problem,下面的代码可以正常工作,例如,它返回正确的值为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!?!?!
答案 0 :(得分:0)
您不应将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);