Можно ли создать бесконечную рекурсию, где функция вызывает саму себя без условия выхода?

Ответ

Да, формально такой код написать можно, но его выполнение почти мгновенно завершится ошибкой переполнения стека вызовов (Stack Overflow).

Пример проблемного кода:

function infiniteRecursion() {
    infiniteRecursion(); // Каждый вызов добавляет новый фрейм в стек
}
infiniteRecursion();

Что происходит:

  1. Каждый вызов функции помещает в стек вызовов информацию о локальных переменных, аргументах и точке возврата.
  2. При бесконечной рекурсии этот стек исчерпывает выделенную ему память.
  3. Интерпретатор PHP аварийно завершает скрипт.

Ограничения в PHP:

  • При активном расширении Xdebug сработает ограничение xdebug.max_nesting_level (по умолчанию 256).
  • Без Xdebug скрипт упадет при достижении лимита стека, установленного самим PHP или операционной системой.

Правильная альтернатива: Для задач, требующих повторения, следует использовать итеративные циклы.

// Вместо рекурсии — цикл
while (true) {
    // ... логика ...
    if ($exitCondition) {
        break; // Контролируемый выход
    }
}

Рекурсию стоит применять только для задач, которые по своей природе рекурсивны (обход деревьев, факториал), и всегда предусматривать базовый случай (base case) для остановки.

Ответ 18+ 🔞

Вот, смотри, с технической точки зрения такой код скомпилируется и даже запустится, но через долю секунды он накроется медным тазом с ошибкой переполнения стека (Stack Overflow). Пиздец, а не результат.

Самый простой пример говнокода:

function infiniteRecursion() {
    infiniteRecursion(); // Каждый чих этой функции кладёт новый кирпич в стек
}
infiniteRecursion();

Что там внутри происходит, ёпта:

  1. Каждый раз, когда функция зовёт саму себя, система судорожно пихает в специальную память (стек) данные: что куда вернуть, что с чем сравнивать. Представь, что ты пытаешься засунуть диван в шкаф, а потом ещё один такой же диван в тот, который уже засунул.
  2. При такой бесконечной рекурсии эта память заканчивается мгновенно. Овердохуища фреймов, а места — ноль.
  3. PHP, видя этот пиздец, просто убивает скрипт нахуй. Всё, приехали.

На что можно упереться в PHP:

  • Если стоит Xdebug, он первый заорует: «Стой, блядь!» — и выкинет ошибку, потому что есть лимит на вложенность вызовов (xdebug.max_nesting_level). Обычно это что-то около 256 раз.
  • Без Xdebug скрипт будет тупо долбить стек, пока операционка или сам PHP не скажут «всё, хуйня, заканчиваем».

Как делать надо, чтобы не было мучительно больно: Для задач, где нужно что-то делать много раз подряд, используй нормальные циклы. Рекурсия — это как острый нож, хороший инструмент, но если им пытаться колоть дрова, останешься без пальцев.

// Вместо рекурсии — простой и понятный цикл
while (true) {
    // ... делаем дела ...
    if ($exitCondition) {
        break; // Выходим красиво и по-взрослому
    }
}

Рекурсию оставь для особых случаев, где она реально уместна: обход папок как дерева, вычисление факториала. И главное правило — всегда делай условие выхода (base case), иначе получишь ту самую хиросиму в стеке.