Как посчитать с помощью рекурсии в Java? - PullRequest
1 голос
/ 07 августа 2020

Итак, я одитирую курс Java по EdX и до этого момента у меня все хорошо. Я пришел к рекурсиям, и одна из задач - создать метод, который считает до определенного числа, помещая запятые между ними (например, System.out.println (writeNum (5)); должен печатать «1, 2, 3, 4, 5, ... n "без запятой в последнем числе).

Кроме того, должно быть исключение IllegalArgumentException, если будет передано значение меньше 1.

Я пробыл на нем 2 дня, ломая голову, и я даже не могу понять, как начать. Я могу сделать факториал:

public static int factorial (int n) {
        if(n == 1){
            return 1;
        }
        System.out.println(n);
        return n*factorial(n-1);

}

Проблем нет? Итак, думая об этом, я все время думаю, каков базовый вариант? Это 1? если так, то я просто отсчитываю и как-то должен отсчитывать, реорганизовывать их, перепечатывать их, а потом как-то так разобраться. Или я делаю свой базовый случай, когда n == n, что тоже не работает ... Я знаю, что, вероятно, слишком обдумываю это, но я понятия не имею, как это даже начать ... Если бы кто-нибудь мог go через это со мной шаг за шагом, чтобы понять это, я был бы искренне благодарен, поскольку я делаю это, потому что я искренне хочу изучить и понять это.

1 Ответ

0 голосов
/ 07 августа 2020

Для рекурсии вам нужно найти, когда возвращаться, например, в приведенном ниже коде, когда n == 1, метод печатает значение n и возвращает. Помимо условия завершения, еще одним важным аспектом является то, где (т.е. перед рекурсивным вызовом метода / функции или после него) вы обрабатываете (например, печатаете) параметр.

public class Main {
    public static void main(String[] args) {
        count(5);
    }

    static void count(int n) {
        if (n == 1) {
            System.out.print(n);
            return;
        }
        count(n - 1);
        System.out.print("," + n);
    }
}

Вывод:

1,2,3,4,5

Вот как это работает:

count(5) -> calls count(4) with remaining thing to do is print ,5 once count(4) returns.
    count(4) -> calls count(3) with remaining thing to do is print ,4 once count(3) returns. 
        count(3) -> calls count(2) with remaining thing to do is print ,3 once count(2) returns.
            count(2) -> calls count(1) with remaining thing to do is print ,2 once count(1) returns. 
                count(1) -> prints 1 and returns. 
            The remaining thing of count(2) is done i.e. ,2 is printed.
        The remaining thing of count(3) is done i.e. ,3 is printed.
    The remaining thing of count(4) is done i.e. ,4 is printed.
The remaining thing of count(5) is done i.e. ,5 is printed.

Отметьте this , чтобы узнать больше о рекурсии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...