Рекурсия — это функция, которая вызывает саму себя. Это мощный инструмент, но чтобы им пользоваться, важно понимать, как работает стек вызовов в JavaScript.
Что такое стек?
Стек — это структура данных, которая работает по принципу LIFO (Last In, First Out) — последним вошёл, первым вышел. Каждый раз, когда вызывается функция, она помещается в стек. Когда функция завершает работу — она удаляется из стека.
Жизненный пример: Представьте стопку тарелок. Вы кладёте одну за другой, и вытаскиваете всегда верхнюю. Так работает и стек вызовов.
Простой пример рекурсии
Напишем функцию, которая считает факториал числа — это классический пример для понимания рекурсии.
Функция вызывает саму себя, уменьшая число, пока не дойдёт до 1. Вот как это работает по шагам:
Как стек работает при рекурсии
Каждый вызов factorial() добавляется в стек. Когда выполнение доходит до factorial(1), функция начинает "раскрываться" в обратном порядке — из стека по одному удаляются вызовы.
Если рекурсия бесконечная, стек переполняется, и вы получаете ошибку RangeError: Maximum call stack size exceeded.
Пример с ошибкой переполнения стека
Такой код никогда не остановится — он будет вызывать себя бесконечно, пока стек не "лопнет".
Когда использовать рекурсию
- При обходе вложенных структур (например, дерево DOM или JSON)
- Для решения задач, где результат зависит от подзадач (факториал, числа Фибоначчи)
- Когда удобно разбить задачу на однотипные подпроблемы
Используй рекурсию аккуратно. Если можно — используй итерацию (циклы), особенно в задачах с большой глубиной — так ты избежишь переполнения стека.