【发布时间】:2012-07-31 18:37:17
【问题描述】:
所以我正在尝试创建一个洪水填充算法,但我不断收到递归错误。该算法似乎具有无限递归,我无法确定原因。我浏览了整个互联网,但我找不到解决方案,因为根据大多数消息来源,我的程序似乎是正确的。然而,似乎有什么不对劲。这是代码的编辑版本。错误信息仍然是最大递归。
我能得到一些帮助吗?
from PIL import Image, ImageTk
from random import *
w= 75
h= w
flood = Image.new("RGB", (w,h), (0,0,0))
x = 0
y = 0
count = 0
colorlist = []
i = 0
while x < w -1:
y = 0
while y < h-1:
r = random()
if r < .25:
flood.putpixel((x,y), (0,0,0))
else:
flood.putpixel((x,y), (255,255,255))
y += 1
x += 1
x = 0
y = 0
while x < w-1:
y = 0
while y < h-1:
r = random()
if x == 0 or y == 0 or x == w-1 or y ==h-1:
flood.putpixel((x,y), (0,0,0))
y += 1
x += 1
def floodfill(x,y, d,e,f, g,h,i, image, count):
count+=1
(a,b,c) = image.getpixel((x,y))
if (a,b,c) == (255,255,255):
(j,k,l) = image.getpixel((x-1,y))
(m,n,o) = image.getpixel((x+1, y))
(p,q,r) = image.getpixel((x,y-1))
(s,t,u) = image.getpixel((x,y+1))
if count > 990:
return
if (a,b,c) == (255,255,255):
image.putpixel((x,y), (g,h,i))
floodfill(x-1, y, d,e,f, g,h,i, image, count)
floodfill(x+1, y, d,e,f, g,h,i, image, count)
floodfill(x, y-1, d,e,f, g,h,i, image, count)
floodfill(x, y+1, d,e,f, g,h,i, image,count)
floodfill(2,2, 0,0,0,255,0,0,flood, 0)
flood.save("flood.png")
print("done")
【问题讨论】:
-
请提供您看到的确切错误消息。
-
RuntimeError: 调用 Python 对象时超出最大递归深度
-
您似乎没有检查 x,y 是否越界 - 当 x 快速向左移动时,这可能导致无限递归。还是您希望您的边界能解决这个问题?
-
Python 的递归限制相对较低,大约为 1000 - 这是 Python 的陷阱,适用于习惯于具有尾递归优化(如方案)的函数式语言的人。
-
好的,所以我添加了更多边框,现在它不会超出范围。它适用于较小尺寸的图像,但是当您增加图像的大小时,它会增加递归量,从而使其达到最大值。
标签: python graphics python-imaging-library