Рекурсивная печать целых чисел в порядке возрастания - PullRequest
0 голосов
/ 19 февраля 2020

Сегодня я сдал экзамен, и возник вопрос:

Напишите метод, который печатает целые числа в порядке по возрастанию рекурсивно от 1 до n:

public class PrintIntegersAscendingOrder {

    static int counter = 0;
    public static void PrintIntegersAscendingOrder (int n)
    {
        if (n == 1)
        {

            System.out.printf("%d\n", ++counter);
        }
        else
        {
            System.out.printf("%d ", ++counter);
            PrintIntegersAscendingOrder(n-1);
        }

    }
    public static void main (String args[])
    {
        PrintIntegersAscendingOrder(5);
    }
}

Хотя этот метод работал сейчас, первоначальный вопрос касался не определения класса, а метода. Там я не смог уместить счетчик (я написал счетчик внутри if на бумаге, но он выдает ошибку в программе). Как я могу написать метод точно и правильно без переменной счетчика?

Ответы [ 3 ]

3 голосов
/ 19 февраля 2020

Вы можете сделать это следующим образом:

public class IntegerAscendingOrder {
    public static void main(String[] args) throws Exception {
        printIntegersAscendingOrder(n);
    }

    private static void printIntegersAscendingOrder(int i) {
        if (i < 1) {
            return;
        }

        printIntegersAscendingOrder(i-1);
        System.out.println(i);
    }
}

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

Обратите внимание на строку if (i < 1) {return;}, это прервет вызовы рекурсивных методов.

Эта статья должна помочь вам Начало работы с рекурсией

1 голос
/ 19 февраля 2020

Сделайте это следующим образом:

public class Main {
    public static void printIntegersAscendingOrder(int n) {
        if (n == 0) {
            return;
        }
        printIntegersAscendingOrder(n - 1);
        System.out.printf("%d ", n);
    }

    public static void main(String args[]) {
        printIntegersAscendingOrder(5);
    }
}

Вывод:

1 2 3 4 5 

Как уже указывал @RobOhRob, счетчик побеждает цель рекурсии в ваш код. Когда вы вызываете функцию рекурсивно, вам нужно проанализировать три важных вещи:

  1. Когда прекратить рекурсивный вызов
  2. Обработка перед выполнением рекурсивного вызова
  3. Обработка перед выполнением рекурсивного вызова

Поскольку вы уже уменьшаете параметр на 1 и передаете его методу для рекурсивного вызова, вы можете просто использовать этот параметр вместо создания дополнительной переменной (например, counter).

0 голосов
/ 19 февраля 2020

В вашем коде вы определили в своем классе метод PrintIntegersAscendingOrder с тем же именем класса PrintIntegersAscendingOrder, в котором он содержится. Эту ошибку можно избежать, например, переименование включающего класса в PrintIntegers. Ниже приведен код класса без ошибок и с рекурсивным методом:

public class PrintIntegers {
    public static void PrintIntegersAscendingOrder(int n) {
        if (n > 0) {
            PrintIntegersAscendingOrder(n - 1);
            System.out.printf("%d\n", n);   
        }
    }
    public static void main (String args[]) {
        PrintIntegersAscendingOrder(5);
    }
}
...