Парадигма возврата: возможно ли это сделать без рекурсии?

Пример: решение судоку с возвратом

Как вы возвращаетесь без рекурсии — используя циклы? Я нашел решение, только когда вы вызываете backtrack ().

1

Решение

Вы можете эмулировать рекурсию со стеком.

По сути, при обратном отслеживании выполняется поиск в глубине в дереве возможных решений. Для судоку это дерево имеет полностью заполненные сетки на листьях и частично заполненные сетки в узлах. Корень — это предоставленная сетка. Узел сетки является дочерним по отношению к другому, если он может быть получен из него путем заполнения числа. Используя эту аналогию между поиском в глубину и обратным отслеживанием, вы можете легко осуществить обратное отслеживание либо рекурсивно, либо с помощью стека.

Стек может (концептуально) содержать сетки кандидатов. Сначала предоставленная (и частично заполненная) сетка помещается в стек. Затем внутри цикла while (проверяющего, пуст ли стек) или нет, верхняя сетка выталкивается. Проверяется, полностью ли заполнена сетка или нет. Если он полностью заполнен, ограничения судоку проверяются, и сетка возвращает его, если они удовлетворены. Если сетка заполнена не полностью, то из нее генерируются другие сетки-кандидаты (возможно, нет), которые все помещаются в стек. Это обобщает идею преобразования, но, конечно, как это не очень эффективно.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector