2013-07-13 2 views
0

не может найти проблему, каждый раз, когда я бегу этот код он идет StackOverflow благодаря этой линиимонет Обмен в Java Code StackOverflowError

countCombine += count(array,money - (array[i]*(int)(money/array[i]))); 

в основном проблема очень легко. Учитывая значение N, если мы хотим внести изменения для N центов, и у нас есть бесконечная подача каждой из S = {S1, S2, ..., Sm} ценных монет, сколько способов мы можем сделать изменение? Порядок монет не имеет значения.

Например, для N = 4 и S = ​​{1,2,3} существует четыре решения: {1,1,1,1}, {1,1,2}, {2,2} , {1,3}. Таким образом, выход должен быть 4. Для N = 10 и S = ​​{2, 5, 3, 6} существует пять решений: {2,2,2,2,2}, {2,2,3,3}, {2,2,6}, {2,3,5} и {5,5}. Таким образом, выход должен быть 5.

public class CoinExchangeProblem { 

     int countCombine = 0; 
     private int count(int array[],int money){ 
    //  sort the array 
    //  Arrays.sort(array);  
    //  System.out.println(Arrays.toString(array)); 


      if (money == 0) { 
       return 1; 
      } else if (money < 0) { 
       return 0; 
      } 


      for(int i = 0; i < array.length; i++){ 
       countCombine += count(array,money - (array[i]*(int)(money/array[i]))); 
      } 
      return countCombine; 

     } 




     public static void main(String[] args) { 
      CoinExchangeProblem coinExch = new CoinExchangeProblem(); 
      System.out.println(coinExch.count(new int[]{1,2,3}, 4)); 
    //  System.out.println(coinExch.count(new int[]{2, 5, 3, 6}, 10)); 
     } 
} 
+0

Запустили ли вы это в отладчике IDE? Если нет, сделайте это как можно скорее. –

+0

yes Я попробовал отладчик, и я думаю: «for (int i = 0;» это причина проблемы. – dayitv89

+0

Вы должны сделать больше 'if (money <0)', чем просто вернуть 0, вам нужно изменить то, что программа в том числе, если он попробовал монету другого значения. Но что более важно, логика вашей рекурсии должна быть продумана и протестирована на бумаге, прежде чем пытаться ее кодировать. Также вам нужно найти способ возврата нескольких решений или печати из нескольких решений. –

ответ

2

Когда эта часть

(array[i]*(int)(money/array[i])) 

равна нулю ваш являются жертвой бесконечной рекурсии, где вы вызываете функцию с тем же количеством денег

You может изменить его на:

if(money >= array[i]) 
     countCombine += count(array,money - (array[i]*(int)(money/array[i]))); 

так что вы никогда не получите нуль здесь, но проверьте его f или больше примеров, так как я не тестировал его много, но я думаю, что это логически правильно

 Смежные вопросы

  • Нет связанных вопросов^_^