Для чего нужна рекурсия в программировании
Что проверяют
Умеете ли вы увидеть рекурсивную структуру в реальной фронтенд-задаче и понимаете ли, чем рекурсия платит за краткость. Следом обычно просят написать обход дерева или развернуть вложенный массив, а потом спрашивают, что будет на очень глубоких данных.
Как отвечать
Рекурсия это решение задачи через ту же задачу меньшего размера. У функции обязательно есть базовый случай, где она не вызывает себя, и шаг, который гарантированно к нему приближает. Каждый вызов кладёт кадр в стек вызовов.
Где она естественна на фронтенде:
- деревья интерфейса: вложенное меню, дерево комментариев, файловый менеджер. В React это компонент, который рендерит сам себя для
children; - обход DOM и AST: поиск узлов, плагины Babel и правила ESLint обходят синтаксическое дерево;
- вложенные данные: глубокое сравнение объектов, нормализация ответа API, сбор всех путей в JSON-схеме формы;
- разделяй и властвуй: быстрая сортировка, сортировка слиянием, бинарный поиск.
Ограничения назовите сами. Глубина стека конечна, при переполнении движок бросает RangeError: Maximum call stack size exceeded, а точный предел зависит от браузера и размера кадра. Оптимизацию хвостовых вызовов стандарт описывает, но из крупных движков её реализует только JavaScriptCore в Safari, в V8 и SpiderMonkey её нет, поэтому рассчитывать на неё нельзя. Для потенциально глубоких данных рекурсию переписывают на цикл с явным стеком. Для типовых задач есть готовое: structuredClone для глубокой копии, arr.flat(Infinity) для разворачивания массива.
Где спотыкаются
Приводят наивные числа Фибоначчи как пример хорошей рекурсии. Из-за повторных вычислений это экспоненциальное время, без мемоизации или цикла такой код не годится.
Забывают про циклические ссылки. Объект, который ссылается сам на себя, уводит обход в бесконечность, нужен WeakSet посещённых узлов.
Ставят базовый случай, который достижим не при всех входных данных: например, проверку n === 0 при дробном или отрицательном n. Функция уходит в бесконечные вызовы до переполнения стека.