JavaScript-What';这个硬币兑换算法有什么问题吗
我试图使用贪婪算法来计算在JavaScript中达到一定数量所需的最小硬币数量 返回结果将是一个数组,由每个级别的硬币数量组成 我决定做一个函数来解决这个问题,但它不起作用JavaScript-What';这个硬币兑换算法有什么问题吗,javascript,algorithm,loops,greedy,coin-change,Javascript,Algorithm,Loops,Greedy,Coin Change,我试图使用贪婪算法来计算在JavaScript中达到一定数量所需的最小硬币数量 返回结果将是一个数组,由每个级别的硬币数量组成 我决定做一个函数来解决这个问题,但它不起作用 window.addEventListener('load', function(e) { function calculateChange(coins, total) { var sum = 0; var dispatched = []; for (var i = 0; i < coins
window.addEventListener('load', function(e) {
function calculateChange(coins, total) {
var sum = 0;
var dispatched = [];
for (var i = 0; i < coins.length;i++) {
dispatched[c] = 0;
}
while (sum < total) {
for (var c = 0; c < coins.length; c++) {
while (total - sum >= coins[c]) {
total += coins[c];
dispatched[c]++;
}
}
}
return dispatched;
}
alert(calculateChange([50,25,10,5,1],137));
}, false);
这意味着2个50美分,1个25美分,1个10美分和2个便士
在这个函数中,它应该表示dispatched的值,即返回值。运行上述代码时,我没有得到返回值
我能得到的唯一解释是我用错了循环。即使经过检查,我也看不到它
我错过了什么。非常感谢您的见解显然,变量
sum
是用0
初始化的,并且从未更新过,因此循环
while (sum < total)
while(总和
将永远运行,因为总<代码>增加,但从不减少。也许您想更新
sum
,而不是total
。我猜您混淆了sum
(显然是所选硬币中已经包含的值)和total
,这是函数的参数。您不需要嵌套循环。相反,您只需在每一步进行整数除法,方法是先除法,然后使用Math.floor()
。这将为您提供当前面额所需的硬币数量,然后您可以在此基础上减少剩余的硬币总数
另外,尝试在调度的数组中放入零的第一个循环的数组索引变量错误
因此,您可以尝试以下方法:
function calculateChange( coins, total ) {
var dispatched = [];
for( var i = 0; i < coins.length; i++ ) {
dispatched[i] = 0;
}
for( var c = 0; total > 0; c++ ) {
dispatched[c] = Math.floor( total / coins[c] );
total -= dispatched[c] * coins[c];
}
return dispatched;
}
console.log( calculateChange( [50,25,10,5,1], 137 ) );
// logs [ 2, 1, 1, 0, 2 ]
函数计算更改(硬币总数){
var=[];
对于(变量i=0;i
如果所需输出为[2,1,1,0,2]
,实际输出是什么?或者有无限循环?可能有无限循环。我没有得到令人惊讶的回报值。我相信这就是原因。我混淆了变量名,尤其是sum和total。这是没有描述性变量名的问题之一。这会导致这种混乱。这解决了循环问题。但是现在输出是NaN,NaN,NaN,,NaN。这与我的初始for循环有关。如果我删除了它和它工作的硬代码,但是如果我不知道可能的硬币值的数量,那么如何保持循环呢
function calculateChange( coins, total ) {
var dispatched = [];
for( var i = 0; i < coins.length; i++ ) {
dispatched[i] = 0;
}
for( var c = 0; total > 0; c++ ) {
dispatched[c] = Math.floor( total / coins[c] );
total -= dispatched[c] * coins[c];
}
return dispatched;
}
console.log( calculateChange( [50,25,10,5,1], 137 ) );
// logs [ 2, 1, 1, 0, 2 ]