Рекурсивный метод ничего не возвращает

Я пишу жадный алгоритм, который использует рекурсивный метод для подсчета количества монет и номинала каждой монеты, который он использует для выдачи сдачи в соответствии с суммой сдачи.

У меня проблемы с рекурсивным методом, потому что он не возвращает никаких данных, я думаю, что проблема связана с использованием моего объекта с рекурсией. Я не включал его, но у меня уже есть правильные методы получения и установки. В первом методе я решаю проблему, используя только итерацию, но когда я запускаю второй метод (используя рекурсию), у меня нет успеха.

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 доллара


person b i c c s    schedule 20.08.2019    source источник
comment
Ваш рекурсивный метод создает новый объект Change для каждого рекурсивного вызова. Если вы хотите, чтобы объект помнил все это, вам, вероятно, следует иметь только один объект, независимо от того, сколько раз рекурсивный метод вызывает сам себя. Переосмыслите свою логику.   -  person Andreas    schedule 21.08.2019
comment
Кроме того, обратите внимание, что самый внутренний Change всегда будет иметь значение 0, и этот экземпляр передается полностью как каждое возвращаемое значение по мере раскручивания стека вызовов.   -  person    schedule 21.08.2019
comment
спасибо обоим, я заметил, что вы указали @Andreas, и теперь я работаю над этим!!   -  person b i c c s    schedule 21.08.2019


Ответы (1)


Это решение, которое я нашел для проблемы: изменил метод на тип void вместо типа объекта, и он работал хорошо.

void greedyRecursivo(int change,int size) {

        setChange(change);
        if (getChange() == 0 || getChange() < 0) {

            return;
        }

        int numMonedas = 0, numTotal = 0;

        numTotal = (getChange() / this.coinSet[size - 1]);

        if (numTotal > 0) {
            numMonedas += numTotal;
            change -= (numTotal * this.coinSet[size - 1]);
            setChange(change);
            switch (this.coinSet[size - 1]) {
                case 20:
                    this.cant20 += numMonedas;
                    setCant20(cant20);
                    break;
                case 10:
                    this.cant10 += numMonedas;
                    setCant10(cant10);
                    break;
                case 5:
                    this.cant5 += numMonedas;
                    setCant5(cant5);
                    break;
                case 1:
                    this.cant1 += numMonedas;
                    setCant1(cant1);
                    break;
            }
        }

        greedyRecursivo(getChange(),size - 1);
       int chan =  cant20+cant10+cant5+cant1;
       if(change == 0){
           System.out.println("Cantidad de monedas utilizadas para dar feria: " + chan + ", " +
                cant20 + " de $20, " + + cant10 + " de $10, "+  cant5 + " de $5, "+
                cant1 + " de $1.");
       }

    }
person b i c c s    schedule 21.08.2019