Skip to main content
 首页 » 编程设计

python之减少 Python 递归深度的方法

2025年05月04日23emanlee

我目前正在制作一个使用 floodfill 递归的程序(例如将带有黑色边框的白色圆圈填充为不同的颜色)。当我点击我的图像进行填充时,只有圆圈的一部分会被填充成不同的颜色,然后我得到了递归错误。我的代码中唯一具有递归的部分就是这个。

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 测试位置测试边界条件。如果那里的像素已经是黑色,您也会忽略这些坐标。