JavaScript-What';这个硬币兑换算法有什么问题吗

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

我试图使用贪婪算法来计算在JavaScript中达到一定数量所需的最小硬币数量

返回结果将是一个数组,由每个级别的硬币数量组成

我决定做一个函数来解决这个问题,但它不起作用

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 ]