В настоящее время я делаю программу, которая использует рекурсию заливки (например, заполнение белого круга черными границами другого цвета). Когда я нажимаю на мое изображение для заливки, только часть круга заполняется в другой цвет, тогда я получаю ошибку рекурсии. Единственная часть моего кода, которая имеет рекурсию, такова.
def floodfill(x,y):
floodfill(x+1,y)
floodfill(x-1,y)
floodfill(x, y+1)
floodfill(x, y-1)
Вы делаете это, не используя рекурсию; вы попадаете в предел рекурсии для кругов с радиусом, соответствующим пределу рекурсии, который по умолчанию равен 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
тесте месте. Если пиксель уже черный, вы также игнорируете эти координаты.