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

Можно ли поставить функцию, вызывающую себя, в бесконечный цикл?

1.0 Junior🔥 192 комментариев
#PHP Core#Алгоритмы и структуры данных

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Можно ли поставить функцию, вызывающую себя, в бесконечный цикл?

Да, безусловно. Это классический пример бесконечной рекурсии, которая теоретически создаёт бесконечный цикл вызовов, но на практике почти всегда приводит к фатальной ошибке выполнения.

Почему это происходит?

Рекурсивная функция вызывает саму себя внутри своего тела. Если отсутствует базовый случай (условие выхода), цепочка вызовов никогда не прервётся. В результате стек вызовов заполняется до переполнения, что вызывает ошибку.

Пример на PHP

function infiniteRecursion() {
    // Отсутствует условие остановки!
    infiniteRecursion(); // Вызов самой себя
}

// Попытка выполнения вызовет переполнение стека
infiniteRecursion();

При выполнении этого кода вы получите фатальную ошибку:

Fatal error: Maximum function nesting level of '256' reached

PHP по умолчанию имеет защиту от бесконечной рекурсии — лимит вложенности вызовов. Это предотвращает полный краш интерпретатора, но не делает выполнение бесконечным.

Более опасный вариант с косвенной рекурсией

Бесконечный цикл может быть не таким очевидным, когда участвуют несколько функций:

function functionA() {
    functionB();
}

function functionB() {
    functionA(); // Косвенная рекурсия
}

Технические ограничения бесконечности

На практике «бесконечный» цикл рекурсии ограничен:

  1. Лимит стека вызовов — каждый вызов функции потребляет память в стеке
  2. Настройки интерпретатора (в PHP — xdebug.max_nesting_level)
  3. Доступная оперативная память
  4. Таймауты выполнения (max_execution_time)

Корректная рекурсия с условием выхода

Правильная рекурсивная функция обязательно содержит:

  • Базовый случай — условие, при котором рекурсия прекращается
  • Рекурсивный шаг — вызов себя с изменёнными параметрами
function countdown($n) {
    if ($n <= 0) { // Базовый случай
        echo "Завершено!";
        return;
    }
    echo $n . "\n";
    countdown($n - 1); // Рекурсивный шаг
}

countdown(5); // Корректно выполнится

Вывод

Хотя теоретически функция, вызывающая себя без условия остановки, представляет собой бесконечный цикл, на практике выполнение прерывается из-за технических ограничений среды выполнения. Для PHP-разработчика понимание этого механизма критически важно, поскольку:

  • Позволяет избегать runtime-ошибок в production-среде
  • Помогает проектировать алгоритмы с использованием рекурсии там, где это уместно (обход деревьев, факториалы, числа Фибоначчи)
  • Даёт понимание работы стека вызовов и потребления памяти

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

Можно ли поставить функцию, вызывающую себя, в бесконечный цикл? | PrepBro