2013-07-01 30 views
0

在這裏我正在處理以下問題,我們給出n種類型的硬幣面值v(1) > v(2) > ... > v(n) (all integers)
下面的代碼試圖找到最小數量的硬幣需要做一個總和-C。這裏的C是100(見主函數)。當我運行代碼時,錯誤 - 「java.lang.StackOverflowError」出現。請幫忙。Stackoverflow錯誤計算硬幣的最小數量作出的總和S

import java.util.ArrayList; 

public class Problem2 { 

    public static int count=4; 
    public static int []v={25,10,5,1}; //Array storing denominations 

    private static int findminimum(ArrayList<Integer> v2) { 

     int count=v2.get(0); 
     for(int i=0;i<v2.size();i++) 
     { 
      if(count>v2.get(i)) 
      { 
       count=v2.get(i); 
      } 
     } 
     return count; 
    } 

    public static int countmincoins(int n) 
    { 
     int t; 
     if(n<0) 
     { 
      t=Integer.MAX_VALUE-100 ; 
     } 
     if(n==0) 
     { 
      t= 0; 
     } 
     else 
     { 
      ArrayList<Integer> a=new ArrayList<Integer>();   
      for(int i=0;i<v.length;i++) 
      { 
       int temp=0; 
       temp=countmincoins(n-v[i])+1; //Stackoverflow error 
       a.add(temp);  
      } 
      t=findminimum(a); 

     } 
     return t; 
    } 


    public static void main(String args[]) 
    { 

     System.out.println(countmincoins(100)); 
    } 
} 
+1

你的第二個'if'應該是'else if'。 – dlev

+0

問題是代碼沒有終止。請幫助爲什麼不被終止 – Akshit

+0

@Ashshit是否需要使用遞歸?循環會更容易。 –

回答

0

如果您並不侷限於使用遞歸以下就會簡單得多:

public static int[] denominations = {25,10,5,1}; 

public static int minimumCoins(int amount){ 
    int total = 0; 
    for(int denomination: denominations){ 
     while(amount - denomination >= 0){ 
      amount -= denomination; 
      total++; 
     } 
    } 
    return total; 
} 

public static void main(String args[]) 
{ 

    System.out.println(minimumCoins(98)); 
} 
+0

你的代碼如何給出最小數量的硬幣......它只是返回總數並且沒有最小條件 – Akshit

+0

@Ashshit你是否試圖簡單地返回最少數量的硬幣來創造一個總數,或者你是否試圖返回該數量的分項版本(4個季度,2個硬幣,1個鎳)?如果你只是想要說98美分我需要8個硬幣,我的代碼就是這樣。 –

+0

Akshit在我的代碼中,最小條件是我通過從最大到最小的面額進行迭代的事實。 –

0

如果使用遞歸,那麼你需要達到終止遞歸的條件。但在你的代碼中,我沒有看到任何終止邏輯。那就是爲什麼,它會陷入無限循環和StackOverflowException。在你的代碼中,你使用下面的代碼來終止。

if(n==0) 
{ 
    t= 0; 
} 

但是這裏n可能不是零。監守countmincoins(n-v[i])不保證你到n將爲0

+0

但我也保持小於0的條件。但它並沒有終止 – Akshit

+0

因爲你需要把esle if(n == 0)。 – Masudul

+0

小於0沒有任何終止的影響。它是孤獨的。它沒有被其他人包圍。 – Masudul

0

你的代碼是無限的事業t將永遠不會被<0 or ==0因爲數組中的值和條件(n - v[i])+1v[i]總是在每次調用返回相同的值到方法,因此無限遞歸。