不清楚为什么这种硬币改变算法有效

时间:2013-05-14 15:12:10

标签: algorithm

昨天我和某人一起工作,让我的硬币更改算法正常工作。

在我看来,

  1. 首先,makeChange1()使用更改金额调用getChange1() ...
  2. getChange1()检查amount == 0,如果是,则会打印列表
  3. if amount >= current denomination,它会将该面额添加到列表然后重复,按当前面额递减金额...
  4. if amount < current denomination,它会重复到下一个面额...(index + 1)
  5. 我不明白一旦金额等于0,将再次调用getChange() ...是不是只说如果金额== 0,它会打印出列表?

        if (amount == 0) {
            System.out.print(total + ", ");
        }
    

    因此,正因为如此,我不确定其余的排列将如何完成...... 一张图片将会非常有用!

    输入

    12 cents
    

    输出

    [10, 1, 1], [5, 5, 1, 1], [5, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    

    代码

    public void makeChange1(int amount) {
        getChange1(amount, new ArrayList<Integer>(), 0);
    }
    
    public void getChange1(int amount, List<Integer> total, int index) {
        int[] denominations = {25, 10, 5, 1};
    
        if (amount == 0) {
            System.out.print(total + ", ");
        }
        if (amount >= denominations[index]) {
            total.add(denominations[index]);
            getChange1(amount-denominations[index], total, index);
            total.remove(total.size()-1);
        }
        if (index + 1 < denominations.length)   {
            getChange1(amount, total, index+1);
        }
    }
    

    谢谢!

1 个答案:

答案 0 :(得分:2)

这不是else-if,打印出列表后方法不会返回。

一旦打印出该行,它将继续

if (index + 1 < denominations.length)   {
    getChange1(amount, total, index+1);
}

将使用递增的索引再次调用您的函数。