Я пишу жадный алгоритм, который использует рекурсивный метод для подсчета количества монет и номинала каждой монеты, который он использует для выдачи сдачи в соответствии с суммой сдачи.
У меня проблемы с рекурсивным методом, потому что он не возвращает никаких данных, я думаю, что проблема связана с использованием моего объекта с рекурсией. Я не включал его, но у меня уже есть правильные методы получения и установки. В первом методе я решаю проблему, используя только итерацию, но когда я запускаю второй метод (используя рекурсию), у меня нет успеха.
public class GreedyAlgorithmPlatzi {
public static void main(String[] args) {
Change change = new Change();
//Method (1)
System.out.println("USING ITERATIVE METHOD");
System.out.println(change.greedyChange(35));
//Method (2)
System.out.println("USING RECURSIVE METHOD");
System.out.println(change.greedyRecursivo(35,change.getCoinSet().length));
}
static class Change {
int change, cant20 = 0, cant10 = 0, cant5 = 0, cant1 = 0;
int coinSet[] = {1, 5, 10, 20};
//THIS METHOD(1) (ITERATIVELY) returns the amount of coins and //its denominations used to give change, accordingly to the change //parameter
Change greedyChange(int cambio) {
Change ch = new Change();
int num;
int monedas = 0;
for (int i = 3; i > -1; i--) {
num = cambio / this.coinSet[i];
if (num > 0) {
monedas += num;
cambio -= (num * this.coinSet[i]);
switch (this.coinSet[i]) {
case 20:
cant20 += monedas;
ch.setCant20(cant20);
break;
case 10:
cant10 += monedas - cant20;
ch.setCant10(cant10);
break;
case 5:
cant5 += monedas - cant20 - cant10;
ch.setCant5(cant5);
break;
case 1:
cant1 += monedas - cant20 - cant10 - cant5;
ch.setCant1(cant1);
break;
}
}
}
ch.setChange(monedas);
return ch;
}
//THIS METHOD(2) (RECURSIVELY) returns the amount of coins and its denominations used to give change, accordingly to the change parameter
Change greedyRecursivo(int change,int size) {
Change chan = new Change();
chan.setChange(change);
if (chan.getChange() == 0 || chan.getChange() < 0) {
chan.setChange(0);
return chan;
}
int numMonedas = 0, numTotal = 0;
numTotal = (chan.getChange() / this.coinSet[size - 1]);
if (numTotal > 0) {
numMonedas += numTotal;
change -= (numTotal * this.coinSet[size - 1]);
chan.setChange(change);
switch (this.coinSet[size - 1]) {
case 20:
this.cant20 += numMonedas;
chan.setCant20(cant20);
break;
case 10:
this.cant10 += numMonedas;
chan.setCant10(cant10);
break;
case 5:
this.cant5 += numMonedas;
chan.setCant5(cant5);
break;
case 1:
this.cant1 += numMonedas;
chan.setCant1(cant1);
break;
}
}
chan = greedyRecursivo(chan.getChange(),size - 1);
return chan;
}
@Override
public String toString() {
return "Amount of coins used: "
+ change + ", " + cant20 + " of $20" + ", " + cant10 + " of $10"
+ ", " + cant5 + " of $5" + ", " + cant1 + " of $1";
}
Вот что я получаю:
ИТЕРАТИВНЫЙ МЕТОД Количество использованных монет: 3, 1 по 20 долларов, 1 по 10 долларов, 1 по 5 долларов, 0 по 1 доллару.
ИСПОЛЬЗУЯ РЕКУРСИВНЫЙ МЕТОД
Количество использованных монет: 0 , 0 из 20 долларов, 0 из 10 долларов, 0 из 5 долларов, 0 из 1 доллара
Вот что я должен получить: ИТЕРАТИВНЫЙ МЕТОД Количество использованных монет: 3, 1 по 20 долларов, 1 по 10 долларов, 1 по 5 долларов, 0 по 1 доллару. ИСПОЛЬЗУЯ РЕКУРСИВНЫЙ МЕТОД. , 1 из 5 долларов, 0 из 1 доллара
Change
для каждого рекурсивного вызова. Если вы хотите, чтобы объект помнил все это, вам, вероятно, следует иметь только один объект, независимо от того, сколько раз рекурсивный метод вызывает сам себя. Переосмыслите свою логику. - person Andreas   schedule 21.08.2019Change
всегда будет иметь значение 0, и этот экземпляр передается полностью как каждое возвращаемое значение по мере раскручивания стека вызовов. - person   schedule 21.08.2019