У меня есть программа на 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);
?>
Я хочу понять, как визуализировать два уровня рекурсии, чтобы определить, на каком этапе разбивается каждый многоугольник?
Но в целом код выполняется последовательно, поэтому, если $this->generate_polygons($polygon_b, $depth-1, 'B');
вызывает внутри него дополнительные вызовы функций, они будут выполнены первыми, прежде чем он, наконец, вернется от всех них обратно к родительской функции, а затем запустит строку $this->generate_polygons($polygon_a, $depth-1, 'A');
.
Спасибо за ваши предложения. Я пытался записать это, но значения не имеют для меня смысла, и (как правило) от рекурсии у меня болит голова. Глубина установлена на 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)
.
Мне трудно объяснить разницу между двумя описанными вами методами. В чем разница между «завершить обработку» и «продолжить разбивать исходный многоугольник B»?
Извиняюсь, что не объяснил как следует. Я пытаюсь выяснить, как именно упорядочиваются рекурсии, потому что я сравниваю выходные данные моего скрипта с кодом Python, и примерно в середине моего скрипта полигоны больше не совпадают, значит, что-то идет не так. Раньше я имел в виду следующее: когда первый многоугольник разделен на два (B и A), будет ли рекурсия продолжать разбивать сторону «B» многоугольников до тех пор, пока не достигнет предела рекурсии, тогда ей придется вернуться и разделить все стороны «А»? Я попытался нарисовать график зависимостей, но до сих пор не совсем понимаю последовательность.
Как говорит А.Дисон, 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 Большое спасибо. Как только я смогу правильно это представить, это, несомненно, обретет больше смысла. Я попробую составить диаграмму, как предложено, а затем сравню с результатом.
Благодаря вкладу @ADyson и @IMSoP мне удалось создать простую анимацию, показывающую точную последовательность рекурсии:
Как уже упоминалось, PHP в этом отношении ничем не отличается от других языков программирования (каждая рекурсия полностью завершается перед переходом к следующей рекурсии), но для меня реальная последовательность теперь намного легче понять, поскольку я могу полностью визуализируйте процесс.
Еще раз спасибо всем за помощь.
Пробовали ли вы добавить в код простую регистрацию/эхо, чтобы увидеть, какой путь он проходит?