Есть ли разница между бесконечной рекурсией и бесконечным циклом

Ответ

Да, разница есть, несмотря на схожий эффект (зависание программы).

Рекурсия:

  • Вызывает саму себя, создавая новые кадры стека
  • Приводит к StackOverflowError при переполнении стека
  • Пример:
void infiniteRecursion() {
    infiniteRecursion();
}

Цикл:

  • Выполняет итерации без роста стека
  • Может работать бесконечно, пока не будет прерван
  • Пример:
while(true) {
    // бесконечный цикл
}

Основное отличие - в использовании памяти: рекурсия расходует стек, цикл - нет. В некоторых языках (например, с оптимизацией хвостовой рекурсии) разница может быть меньше.

Ответ 18+ 🔞

А, слушай, вот это классика, блядь! Чувак приходит и такой: «А в чём разница-то? Оба зависают, нихуя не понятно!». Ну, давай разберём, как есть, без соплей.

Смотри, рекурсия — это как пьяный дед на свадьбе, который рассказывает анекдот, а в конце вспоминает, что забыл про тёщу, и начинает заново. Он сам себя вызывает, блядь. Каждый раз, когда он открывает рот, чтобы начать историю снова, ему на голову кладут новый лист бумаги (это кадр стека). Рано или поздно эта стопка бумаг дохуя какой высокой становится, и всё — StackOverflowError, ёпта! Дед захлебнулся собственным бредом, программа — труп. Вот как это выглядит в коде, тут всё честно:

void infiniteRecursion() {
    infiniteRecursion(); // Ну всё, поехали. Себя вызывает, себя, себя... Пиздец.
}

А теперь цикл — это уже другой мудила. Это как белка в колесе, сука. Она не рассказывает историю заново, она просто бежит по кругу на одном месте. Новых бумажек на голову не кладут, стек не растёт, она просто тупо долбит одно и то же. Может бежать до скончания века, пока её кто-нибудь не выключит или батарейка не сядет.


while(true) {
    // бесконечный цикл
    // Бегай, белочка, бегай. Стек не трогаем, ебём только процессорное время.
}
**

Так что главная разница, блядь, не в том, что оба могут не кончаться, а в том, **как они жрут память**. Рекурсия — обжора, она сожрёт твой стек, как голодный студент доширак. Цикл — аскет, он может жрать только твоё процессорное время, но память стека ему похуй.

Ну, и да, есть, конечно, языки с хитрой жопой, где эту рекурсию **хвостовую** оптимизируют и превращают почти в цикл, но это уже высший пилотаж, ёперный театр. В обычной-то жизни — запомни: рекурсия = стек взрывает, цикл = процессор мучает. Всё, вопрос закрыт, в рот меня чих-пых!