не может найти проблему, каждый раз, когда я бегу этот код он идет 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));
}
}
Запустили ли вы это в отладчике IDE? Если нет, сделайте это как можно скорее. –
yes Я попробовал отладчик, и я думаю: «for (int i = 0;» это причина проблемы. – dayitv89
Вы должны сделать больше 'if (money <0)', чем просто вернуть 0, вам нужно изменить то, что программа в том числе, если он попробовал монету другого значения. Но что более важно, логика вашей рекурсии должна быть продумана и протестирована на бумаге, прежде чем пытаться ее кодировать. Также вам нужно найти способ возврата нескольких решений или печати из нескольких решений. –