Способы уменьшения глубины рекурсии в Python

1

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

def floodfill(x,y):
    floodfill(x+1,y)
    floodfill(x-1,y)
    floodfill(x, y+1)
    floodfill(x, y-1)
Теги:

1 ответ

5
Лучший ответ

Вы делаете это, не используя рекурсию; вы попадаете в предел рекурсии для кругов с радиусом, соответствующим пределу рекурсии, который по умолчанию равен 1000, и лимит не может быть произвольно поднят. Вместо этого используйте итеративный подход. Вы можете сделать это здесь с очередью:

from collections import deque

def floodfill(x, y, _directions=((-1, 0), (0, -1), (1, 0), (0, 1))):
    queue = deque([(r, c)])
    handled = {(r, c)}
    while queue:
        r, c = queue.popleft()
        for dr, dc in _directions:
            nr, nc = r + dr, c + dc
            if (nr, nc) not in handled:
                handled.add((nr, nc))
                queue.append((nr, nc))

                # do something with these coordinates, like filling
                # this position in an image.

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

Вы также испытаете для граничных условий в том же, if тесте месте. Если пиксель уже черный, вы также игнорируете эти координаты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню