← Назад к вопросам

Зачем нужна рекурсия?

1.0 Junior🔥 141 комментариев
#Soft Skills и рабочие процессы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Рекурсия в программировании

Рекурсия - это техника программирования, когда функция вызывает сама себя для решения задачи путём разбиения её на подзадачи того же типа.

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

Функция является рекурсивной, если она вызывает сама себя с другими параметрами, пока не достигнет базового случая (условия остановки).

Зачем нужна рекурсия?

1. Решение задач с древовидной структурой

Рекурсия идеально подходит для работы с иерархическими данными:

// Подсчёт всех файлов в директориях
function countFiles(directory) {
  let count = 0;
  
  for (const item of directory.items) {
    if (item.isFile) {
      count++;
    } else if (item.isDirectory) {
      count += countFiles(item); // Рекурсивный вызов
    }
  }
  
  return count;
}

2. Обход DOM-элементов

В DOM часто нужно рекурсивно обойти все вложенные элементы:

function traverseDOM(element) {
  console.log(element);
  
  for (const child of element.children) {
    traverseDOM(child); // Обход дочерних элементов
  }
}

traverseDOM(document.body);

3. Работа с вложенными объектами и массивами

Поиск в глубоко вложенных структурах:

function findValueByKey(obj, key) {
  for (const k in obj) {
    if (k === key) {
      return obj[k];
    }
    if (typeof obj[k] === "object" && obj[k] !== null) {
      const result = findValueByKey(obj[k], key);
      if (result !== undefined) {
        return result;
      }
    }
  }
}

4. Математические вычисления

Факториал, числа Фибоначчи, степень числа:

// Факториал
function factorial(n) {
  if (n <= 1) return 1; // Базовый случай
  return n * factorial(n - 1); // Рекурсивный случай
}

console.log(factorial(5)); // 120

// Числа Фибоначчи
function fibonacci(n) {
  if (n <= 1) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
}

Компоненты рекурсии

Базовый случай (Base case) - условие, при котором рекурсия останавливается:

if (n === 0) return 1; // Без этого будет бесконечная рекурсия

Рекурсивный случай - вызов функции с упрощённым параметром:

return n * factorial(n - 1); // n-1 ближе к базовому случаю

Преимущества рекурсии

  • Естественное решение для задач с рекурсивной структурой
  • Меньше кода - часто компактнее итеративного подхода
  • Легче понять логику - отражает суть задачи

Недостатки и подводные камни

Stack overflow - при глубокой рекурсии память переполняется:

function deepRecursion(n) {
  if (n === 0) return;
  deepRecursion(n - 1); // При n > ~10000 ошибка!
}

Производительность - повторные вычисления без оптимизации:

// Медленно: fibonacci(40) вычисляется долго
function slowFibonacci(n) {
  if (n <= 1) return n;
  return slowFibonacci(n - 1) + slowFibonacci(n - 2);
}

// Быстро: с мемоизацией
const memo = {};
function fastFibonacci(n) {
  if (n in memo) return memo[n];
  if (n <= 1) return n;
  memo[n] = fastFibonacci(n - 1) + fastFibonacci(n - 2);
  return memo[n];
}

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

  • Работа с древовидными структурами
  • Обход графов и DOM
  • Математические расчёты
  • Задачи разделения и покорения (divide and conquer)

Для простых линейных операций лучше использовать циклы - они быстрее и безопаснее по памяти.