Что такое рекурсия

Рекурсией называют процесс, когда функция вызывает сама себя. То есть, объявляется функцию и в ее теле происходит обращение к ней же (она вызывается). Важным в рекурсии является граничное условие, при выполнении которого функция прекратит вызываться и вернет какое-то значение. Без этого условия возникнет ошибка о переполнении стека вызовов:

Uncaught RangeError: Maximum call stack size exceeded

На собеседованиях очень любят задавать вопросы про рекурсию или предложить решить задачку используя ее, так как это один из базовых принципов в программировании. Если вы Junior Front-End разработчик, то очень высока вероятность, что на собеседовании спросят что-то на эту тему, поэтому полезно знать, что такое рекурсия.

Пример рекурсии

Классический пример рекурсии — это, конечно же, факториал, его приводят во всех книжках по программированию, где упоминается рекурсия.

На всякий случай вспомним, что это такое. В математике факториал числа n равен произведению всех целых положительных чисел меньших или равных ему, и обозначается как n! Формулой можно выразить так:

n! = n * (n - 1) * (n - 2) * … * 3 * 2 * 1

Например, факториал числа 4! = 1 * 2 * 3 * 4 = 24, а для 6! = 1 * 2 * 3 * 4 * 5 * 6 = 720. Факториал нуля равен единице: 0! = 1.

Чтобы можно было сравнить разные подходы, для начала давайте приведем пример вычисления факториала в JavaScript с помощью простого цикла.

function factorial(n) {
  let result = 1;

  for (let i = n; i > 0; i--) {
    result *= i;
  }

  return result;
}

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

Давайте теперь решим задачу с помощью рекурсии. Математически рекурсию можно выразить следующей формулами:

n! = n * (n - 1)!

или

n! = n * (n - 1) * (n - 2)!

или

n! = n * (n - 1) * (n - 2) * (n - 3)!

И так далее, пока не дойдем до нуля.

Теперь тоже самое, но с помощью JavaScript.

function factorial(n) {
  if (n === 0) {
    return 1;
  }

  return n * factorial(n - 1);
}

Как видите этот пример еще короче и выглядит проще. Сначала описано граничное условие, когда n равен нулю и какой результат при этом должен быть. Напомню, что без этого условия возникнет ошибка.

Рекурсивный вызов данной функции для конкретного примера можно изобразить следующим образом:

factorial(4) = 4 * factorial(3);
factorial(4) = 4 * (3 * factorial(2));
factorial(4) = 4 * (3 * (2 * factorial(1)));
factorial(4) = 4 * (3 * (2 * (1 * factorial(0))));
factorial(4) = 4 * (3 * (2 * (1 * 1))));

factorial(0) = 1, потому, что у нас есть граничное условие, при n = 0 мы возвращаем 1.

На этом, про рекурсию в JavaScript, все. Надеюсь, смог помочь начинающему веб разработчику понять, что такое рекурсия.