javascript - 为什么我的硬币找零功能包含在记忆缓存中时不起作用?
问题描述
我正在尝试经典的硬币找零问题,我的以下代码工作正常,例如,它返回正确的值 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!?!?!
解决方案
您不应将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);
推荐阅读
- python - 导入时相对路径和绝对路径出错
- javascript - Javascript:加载页面时出错
- google-chrome - 隐藏时单击页面操作时显示弹出窗口(灰显,非活动)
- sql-server - 执行宏时出错
- angular - 如何通过 RX.js 在另一个流中使用参数?
- sparql - 从 wikidata SPARQL 获取一个国家使用的语言列表
- css - Sass中特定条件下给P标签元素加边框
- typescript - Typescript 3.0.1 编译器选项 typeRoots 无法识别
- web-crawler - 使 StormCrawler 能够爬取具有多个 spout 的单个域
- opengl - ComputeShader 和 SSBO 读/写问题