Перейти к содержанию

Алгоритмы в Node: рекурсия, деревья и обход графов

Начало урока

Алгоритмы в Node: рекурсия, деревья и обход графов

Рекурсия, её реальная цена и как моделировать и обходить деревья и графы средствами чистого Node.

Главная идея: две из самых частых структур в реальной работе с Node — каталог вложенных папок и набор модулей, зависящих друг от друга — это дерево и граф. Естественный инструмент для обоих — рекурсия: функция, которая решает задачу, вызывая саму себя на меньшей части. Этот урок делает рекурсию точной (базовый случай, стек вызовов, мемоизация и когда лучше цикл), затем применяет её к обходу дерева файловой системы и разрешению графа зависимостей, и завершается двумя каноническими обходами — в ширину и в глубину.
Вы уже знаете массивы, Map/Set и fs/promises из среднего курса. К концу этого урока вы сможете:
  • писать рекурсивную функцию с корректным базовым случаем и рассуждать о её стеке вызовов;
  • назвать компромиссы рекурсии и применять мемоизацию там, где она действительно помогает;
  • моделировать дерево и граф в Node и обходить дерево каталогов;
  • разрешать зависимости через топологический порядок и обнаруживать циклы;
  • реализовывать и выбирать между поиском в ширину (BFS) и в глубину (DFS).

1. Рекурсия: базовый и рекурсивный случай

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

function factorial(n) {
  if (n <= 1) return 1;          // base case: stop recursing
  return n * factorial(n - 1);    // recursive case: shrink toward the base
}
console.log(factorial(5)); // 120

Читайте это как контракт: factorial(5) доверяет factorial(4) быть верным, умножает на 5 и возвращает. Базовый случай (n <= 1) — это то, что останавливает спуск. Уберите его — и функция никогда не завершится.

Аналогия. Рекурсия — это матрёшка. Чтобы сосчитать кукол, вы открываете внешнюю (немного работы), затем задаёте тот же вопрос кукле внутри (рекурсивный вызов). Самая маленькая цельная кукла, которую нельзя открыть, — это базовый случай; без него вы открывали бы вечно.

Рекурсия блистает, когда сами данные вложены на неизвестную глубину — папки внутри папок или ветка комментариев с ответами на ответы. Плоский цикл for не может легко выразить «и повтори это для каждого потомка, как бы глубоко он ни уходил»; рекурсия — может.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя