Рекурсия — это функция, которая вызывает саму себя. Это мощный инструмент, но чтобы им пользоваться, важно понимать, как работает стек вызовов в JavaScript.

Что такое стек?

Стек — это структура данных, которая работает по принципу LIFO (Last In, First Out) — последним вошёл, первым вышел. Каждый раз, когда вызывается функция, она помещается в стек. Когда функция завершает работу — она удаляется из стека.

Жизненный пример: Представьте стопку тарелок. Вы кладёте одну за другой, и вытаскиваете всегда верхнюю. Так работает и стек вызовов.

Простой пример рекурсии

Напишем функцию, которая считает факториал числа — это классический пример для понимания рекурсии.

Функция вызывает саму себя, уменьшая число, пока не дойдёт до 1. Вот как это работает по шагам:

Как стек работает при рекурсии

Каждый вызов factorial() добавляется в стек. Когда выполнение доходит до factorial(1), функция начинает "раскрываться" в обратном порядке — из стека по одному удаляются вызовы.

Если рекурсия бесконечная, стек переполняется, и вы получаете ошибку RangeError: Maximum call stack size exceeded.

Пример с ошибкой переполнения стека

Такой код никогда не остановится — он будет вызывать себя бесконечно, пока стек не "лопнет".

Когда использовать рекурсию

  • При обходе вложенных структур (например, дерево DOM или JSON)
  • Для решения задач, где результат зависит от подзадач (факториал, числа Фибоначчи)
  • Когда удобно разбить задачу на однотипные подпроблемы

Используй рекурсию аккуратно. Если можно — используй итерацию (циклы), особенно в задачах с большой глубиной — так ты избежишь переполнения стека.