Я пытаюсь создать программу, которая выводит все возможные уникальные способы внесения изменений для заданного ввода, используя ТОЛЬКО рекурсию и постоянную память (поэтому без циклов).
Для суммы в 25 центов это должны распечатать все возможные комбинации в следующем примере формата:
0*25+0*10+1*5+20*1
0*25+0*10+2*5+15*1
etc..
Где 0 * - это число четвертей (25), использованных в качестве примера
Проблема с моей программой заключается в том, что она распечатывается только:
0=0*25+0*10+0*5+25*1+
, а не остальные комбинации. Я подозреваю, что это из-за того, что я испортил методы printCombination и getLargerCombination (которые в основном являются рекурсивными методами, имитирующими для l oop), но я не могу понять, в чем проблема.
Вот весь код:
public class HW {
static int[] coins = {25,10,5,1};
static int[] counts = new int[coins.length];
static void getCombinations(int[] counts, int startIndex, int totalAmount) {
if(startIndex>= coins.length) {
System.out.print(""+totalAmount+"=");
printCombinations(0);
return;
}
if(startIndex == coins.length - 1) {
if(totalAmount%coins[startIndex]==0) //good combo
{
//setting count of coins at start index
counts[startIndex] = totalAmount/coins[startIndex];
//move on to recursive calls
getCombinations(counts, startIndex + 1, 0);
}
}
else //still need to choose 0-N larger coins
{
getLargerCoins(0, totalAmount, startIndex);
}
}
//Prints out all the possible combinations of change
static void printCombinations(int i) {
if(i >= coins.length) {
System.out.print("\n");
return;
}
System.out.print("" + counts[i] + "*" + coins[i] + "+");
printCombinations(++i);
}
static void getLargerCoins(int j, int totalAmount, int startIndex) {
if(j >= totalAmount/coins[startIndex]) {
return;
}
//for every cycle in the loop, we choose an arbitray # of larger coins and proceed next
counts[startIndex] = j;
getCombinations(counts, startIndex+1, totalAmount-coins[startIndex]*j);
j++;
}
public static void main(String[] args) {
getCombinations(counts, 0, 25);
}
}
**** РЕДАКТИРОВАНИЕ: *****
В методе getLargerCoins я просто повторил j ++, но забыл вызвать метод getLargerCoins для продолжения рекурсии. Исправил строку, написав:
getLargerCoins(++j, totalAmount, startIndex);
Вывод при запуске программы:
0=0*25+0*10+0*5+25*1+
0=0*25+0*10+1*5+20*1+
0=0*25+0*10+2*5+15*1+
0=0*25+0*10+3*5+10*1+
0=0*25+0*10+4*5+5*1+
0=0*25+1*10+0*5+15*1+
0=0*25+1*10+1*5+10*1+
0=0*25+1*10+2*5+5*1+
Однако он по-прежнему не выводит все возможные комбинации