PHP – если рекурсивная функция вызывается внутри себя дважды, в каком порядке будут выполняться вызовы?

У меня есть программа на Python, которую я пытаюсь преобразовать в PHP (как это разрешено лицензией программы), которая рисует случайные многоугольники. Часть этого кода содержит рекурсивную функцию, которая разбивает первый отправленный ему многоугольник на два новых многоугольника (полигон B и многоугольник A), затем эти многоугольники снова разбиваются с помощью рекурсивной функции до заранее определенного количества итераций ( используя значение в $Deep, которое проверяется внутри функции, но опущено в моем коде):

<?php

function generate_polygons($polygon, $depth, $polygon_type=NULL)
{
    // code omitted for clarity

    $this->generate_polygons($polygon_b, $depth-1, 'B');
    $this->generate_polygons($polygon_a, $depth-1, 'A');
}

$generate_polygons($starting_polygon, $depth);

?>

Я хочу понять, как визуализировать два уровня рекурсии, чтобы определить, на каком этапе разбивается каждый многоугольник?

Пробовали ли вы добавить в код простую регистрацию/эхо, чтобы увидеть, какой путь он проходит?

ADyson 13.04.2024 16:05

Но в целом код выполняется последовательно, поэтому, если $this->generate_polygons($polygon_b, $depth-1, 'B'); вызывает внутри него дополнительные вызовы функций, они будут выполнены первыми, прежде чем он, наконец, вернется от всех них обратно к родительской функции, а затем запустит строку $this->generate_polygons($polygon_a, $depth-1, 'A');.

ADyson 13.04.2024 16:09

Спасибо за ваши предложения. Я пытался записать это, но значения не имеют для меня смысла, и (как правило) от рекурсии у меня болит голова. Глубина установлена ​​на 3, а порядок (со значением глубины в скобках): STARTING POLYGON(3), B(2), B(1), B(0), A(0), A(1), B(0), A(0), A(2), B(1), B(0), A(0), A(1), B(0), A(0).

Noel Whitemore 13.04.2024 16:13

Мне трудно объяснить разницу между двумя описанными вами методами. В чем разница между «завершить обработку» и «продолжить разбивать исходный многоугольник B»?

Barmar 13.04.2024 19:33

Извиняюсь, что не объяснил как следует. Я пытаюсь выяснить, как именно упорядочиваются рекурсии, потому что я сравниваю выходные данные моего скрипта с кодом Python, и примерно в середине моего скрипта полигоны больше не совпадают, значит, что-то идет не так. Раньше я имел в виду следующее: когда первый многоугольник разделен на два (B и A), будет ли рекурсия продолжать разбивать сторону «B» многоугольников до тех пор, пока не достигнет предела рекурсии, тогда ей придется вернуться и разделить все стороны «А»? Я попытался нарисовать график зависимостей, но до сих пор не совсем понимаю последовательность.

Noel Whitemore 13.04.2024 20:38

Как говорит А.Дисон, PHP не делает ничего особенного, поскольку вызов функции рекурсивен, он просто выполняет действия в том порядке, в котором вы ему указываете. Попробуйте нарисовать дерево, в котором каждый узел имеет B и A под ним: начальное состояние имеет две ветви: B(2) и A(2); B(2) имеет ветви B(1) и A(1), а A(2) имеет свои B(1) и A(1); под каждым из них находятся листья B(0) и A(0) (всего по четыре листа каждого). Проследите маршрут через дерево, всегда сначала посещая B и возвращаясь к A только тогда, когда все под B будет сделано. Вы обнаружите, что он соответствует полученному вами отладочному выводу.

IMSoP 14.04.2024 00:17

@IMSoP Большое спасибо. Как только я смогу правильно это представить, это, несомненно, обретет больше смысла. Я попробую составить диаграмму, как предложено, а затем сравню с результатом.

Noel Whitemore 14.04.2024 01:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря вкладу @ADyson и @IMSoP мне удалось создать простую анимацию, показывающую точную последовательность рекурсии:

Как уже упоминалось, PHP в этом отношении ничем не отличается от других языков программирования (каждая рекурсия полностью завершается перед переходом к следующей рекурсии), но для меня реальная последовательность теперь намного легче понять, поскольку я могу полностью визуализируйте процесс.

Еще раз спасибо всем за помощь.

Другие вопросы по теме