Понятие рекурсии на самом деле не ограничены на любой конкретный язык. Идея этого в том, что функция вызывает себя.
Давайте рассмотрим ваш пример: факториальная функция. Но сейчас давайте отложим реализацию и рассмотрим ее в более абстрактных терминах. Функция состоит из двух элементов:
i) Инструкция по вычислению элемента 'n'.
II) Инструкция, как рассчитать начальный элемент
Так как же мы вычислим элемент n
для факториала? Мы n
и умножить его на факториал предыдущего элемента: n-1
:
п * Факториал (п-1)
И есть только один начальный пункт: 0
. То есть, когда n == 0
результат 1
или другими словами Factorial(0)
дает 1
.
алгоритм значение содержит действительно этих двух шагов
if (x == 0)
return 1; // Do this when calculating Factorial of 0
else
return x * Factorial (x-1); // Do this when calculating an element n
Ok. Теперь, что происходит, когда мы хотим рассчитать факториал 4? Давайте перейдем к конкретным шагам.
Factorial(4) -> 4 * Factorial(4-1) -> 4 * Factorial(3)
Мы вызывается факториал 4
. Поэтому умножим 4 на факториал 4-1. Для того, чтобы получить факториал 4-1 снова вызвать функцию факториала:
Factorial(3) -> 3 * Factorial(3-1) -> 3 * Factorial(2)
Теперь нам нужно вычислить факториал 2.
Factorial(2) -> 2 * Factorial(2-1) -> 2 * Factorial(1)
И из 1
Factorial(1) -> 1 * Factorial(1-1) -> 1 * Factorial(0)
Обратите внимание, что теперь мы должны вычислить факторный номер 0. Но здесь мы имеем ve специальная инструкция: если аргумент равен 0, результат должен быть равен 1. Давайте вернем наши расчеты:
Factorial(0)
is 1. Замените результат вычисления для факториала 1.
Factorial(1) -> 1 * Factorial(1-1) -> 1 * 1
который также 1
Factorial(2) -> 2 * Factorial(1) -> 2 * 1 -> 2
Factorial(3) -> 3 * Factorial(2) -> 3 * 2 -> 6
Factorial(4) -> 4 * Factorial(3) -> 4 * 3 -> 12
Вы упомянули следующее объяснение:
Каждый раз, когда метод вводится, н ew int выделяется в стеке, и каждый раз, когда метод завершается, int освобождается.
Этих шагов, когда мы идем в Factorial
функции для вычисления факториала для предыдущего числа, когда новый ИНТ должен быть выделен в стеке: для факториала 4 числа 4 помещается в стеке и алгоритм вычисляет факториал из 3 и т. д. И когда мы дойдем до самого конца, то есть с факториалом 0, мы можем, наконец, начать освобождать номера. Мы имеем факториал 0, умножим результат на 1. Факториал 1 возвращается и 1 освобождается. То же самое происходит для 2, 3 и, наконец, 4.
Надеюсь, что прояснилось целое понятие немного. Я знаю, что объяснение обширно, но, с другой стороны, сложно понять его с самого начала, поэтому я предпочел быть слишком тщательным.
Подсказка: N! = N * (N-1) !, например, 7! = 7 * 6! и 6! = 6 * 5! и так далее. – NoChance
Попробуйте изучить стек вызовов в отладчике. – HABO