Как работает рекурсивный метод?

Объясните пожалуйста подробно по шагам, что происходит на каждом шаге этого кода

Два часа уже бьюсь, никак не могу понять принципа, понятно только, что происходит до значения = 1, а куда оно return'ится и что дальше происходит - "темный лес".

class Factorial {

    int fact(int n) {
        int result;
        if (n == 1) {
            return 1;
        }
        result = fact(n - 1) * n;
        return result;
    }
}
class Recursion {

    public static void main(String args[]) {
        Factorial f = new Factorial();

        System.out.println("Факториал 3 равен " + f.fact(3));
    }
}
  • Вопрос задан
  • 8131 просмотр
Решения вопроса 1
@veontomo
Значение возвращается тому, кто его запросил.
Например, если запросить f.fact(1), то метод Factorial::fact сразу вернет 1.
Для запроса f.fact(2) цепочка вызовов будет такой:
сначала запрос Factorial::fact(2), который вернет Factorial::fact(1) * 2.
В ответе есть снова запрос Factorial::fact(1), который возвращает 1. Таким образом, получаем 2*1, т.е. 2.

По этой же схеме проходят и остальные примеры:
f.fact(10) -> f.fact(9) * 10 -> f.fact(8) * 9 * 10 -> ... -> f.fact(1) * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
sdevalex
@sdevalex
Сделай
// ...
result = fact(n - 1) * n;
System.out.println(result);
// ...

Станет понятно, что куда возвращается.
Ответ написан
@swinntus
По сути, этот метод зациклан до того момента, пока n не будет = 1, после чего он начинает выполнять умножение вначале на 2, потом на 3 и т.д. пока значение не будет = n, после чего метод возвращает полученное произведение
Ответ написан
Комментировать
afiskon
@afiskon
Метод вызывает сам себя. Что тут непонятного?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы