2013-05-14 47 views
1

我曾與某人昨天從我的硬幣更改算法工作。不清楚爲什麼這個硬幣更改算法工作

在我看來是,

  1. 第一,makeChange1()電話getChange1()與變化量...
  2. getChange1()檢查量== 0,如果是的話,它會打印列表
  3. 如果amount >= current denomination,它將添加到名單然後重複,面額減少當前面額...
  4. 如果amount < current denomination,它重新出現在下一個面額...(索引+ 1)

我不明白如何,一旦量等於0 getChange()將會再次調用......不只是說,如果量== 0,它只是打印出清單?

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

因此,因爲這個我不知道是怎麼排列的其餘部分將被建成...... 的畫面將reallly幫助!

輸入

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); 
    } 
} 

謝謝!

+0

歡迎來到遞歸算法的世界 – 2013-05-14 15:14:02

+0

@AsierAranbarri是的,我已經在這個世界上呆了幾個月了......我做了一個遞歸的迴文檢查器,這對我來說是完全有意義的......但是這不是。 – Growler 2013-05-14 15:15:56

+1

這就是爲什麼這個世界非常有趣。遞歸方整夜(不允許小雞) – 2013-05-14 15:16:56

回答

2

這不是else-if並且打印出列表後該方法不返回。

一旦它打印出的線,它會繼續

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

這將用遞增的指數再次調用你的函數。

+0

我意識到它會繼續到那條線,但是不是那個點的數量等於零?因此,當你調用最後一個if,'getChange1(amount,total,index + 1);'如果你已經打印出列表,那麼你傳遞的是零,對吧? – Growler 2013-05-14 15:17:19

+0

就像我完全理解第一個排列怎樣出現'[10,1,1]',但爲什麼要再次調用算法給我們'[5,5,1,1],[5,1,1] 1,1,1,1,1]等等......? – Growler 2013-05-14 15:23:47

+0

@Growler'amount'永遠不會被重新分配,所以它在該函數開始的時候仍然具有相同的值。 – sepp2k 2013-05-14 15:25:24