В чем разница между циклом и рекурсией?

«В чем разница между циклом и рекурсией?» — вопрос из категории Алгоритмы и структуры данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Цикл (итерация) — это управляющая конструкция, которая повторяет блок кода, пока выполняется заданное условие. Рекурсия — это подход, при котором функция вызывает саму себя для решения подзадач.

Сравнение:

Аспект Цикл Рекурсия
Механизм Итерация с явным управлением состоянием (счетчик, условие). Вызов функции с новым набором аргументов, образующих цепочку вызовов.
Память Использует фиксированное количество памяти (переменные). Каждый вызов добавляет кадр стека (локальные переменные, адрес возврата). Может привести к StackOverflowException.
Производительность Обычно выше (меньше накладных расходов). Ниже (затраты на вызов функции, управление стеком).
Читаемость Может быть менее интуитивной для рекурсивных по природе задач (деревья, комбинаторика). Часто более ясна и лаконична для таких задач, так как напрямую отражает рекурсивное определение.
Преобразование Любую рекурсию можно преобразовать в цикл (часто с использованием стека). Не любой цикл легко переписать как рекурсию.

Пример: Вычисление факториала.

// Решение циклом
int FactorialLoop(int n)
{
    int result = 1;
    for (int i = 2; i <= n; i++)
        result *= i;
    return result;
}

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

Когда что использовать:

  • Цикл: Для простых итераций, обработки массивов/списков, когда глубина повторений известна или велика.
  • Рекурсия: Для обхода древовидных структур (файловая система, DOM, AST), решения задач «разделяй и властвуй» (быстрая сортировка, бинарный поиск), когда решение естественно выражается через себя.