好吧我必须写一个像paint中的自动填充功能一样的函数。它必须是递归的;我得到了递归的原理,这是我第一次使用它,这是我得到的东西或沿着这些线的东西,然后我要求一组坐标改变“。”。相应地进入“x”,到目前为止除了功能以外都很好:
.... .... XX
... ... x..x
... ... x..x
... ... x..x
.... .... XX
我尝试使用5-6种方式,这是最新的:
def autoFill(yCoordinate,xCoordinate,listOfCharacters,x,y):
if listOfCharacters[xCoordinate][yCoordinate]==".":
flag=True
listOfCharacters[xCoordinate][yCoordinate]="x"
else:
return
if flag==True:
if yCoordinate<x and flag2==1:
autoFill(yCoordinate+1,xCoordinate,listOfCharacters,x,y,yc,xc)
elif yCoordinate>0:
autoFill(yCoordinate-1,xCoordinate,listOfCharacters,x,y,yc,xc)
elif xCoordinate<x:
autoFill(yCoordinate,xCoordinate+1,listOfCharacters,x,y,yc,xc)
elif xCoordinate>0:
autoFill(yCoordinate,xCoordinate-1,listOfCharacters,x,y,yc,xc)
return listOfCharacters
答案 0 :(得分:2)
也许是这样的:
def floodfill (chars, x, y):
try:
if chars [y] [x] == 'x': return
chars [y] [x] = 'x'
for xoff, yoff in ( (0, 1), (0, -1), (1, 0), (-1, 0) ):
floodfill (chars, x + xoff, y + yoff)
except: pass
例如,此代码段:
a = '''....xx....
...x..x...
...x..x...
...x..x...
....xx....'''
chars = [ [c for c in line] for line in a.split ('\n') ]
floodfill (chars, 0, 0)
print ('\n'.join (''.join (c for c in line) for line in chars) )
print ('-' * 20)
chars = [ [c for c in line] for line in a.split ('\n') ]
floodfill (chars, 5, 3)
print ('\n'.join (''.join (c for c in line) for line in chars) )
产生输出:
xxxxxxxxxx
xxxx..xxxx
xxxx..xxxx
xxxx..xxxx
xxxxxxxxxx
--------------------
....xx....
...xxxx...
...xxxx...
...xxxx...
....xx....
没有循环:
def floodfill (chars, x, y):
try:
if chars [y] [x] == 'x': return
chars [y] [x] = 'x'
floodfill (chars, x + 1, y)
floodfill (chars, x - 1, y)
floodfill (chars, x, y + 1)
floodfill (chars, x, y - 1)
except: pass
答案 1 :(得分:0)
我看到了一些问题。
首先,您在递归调用中引用了几个不存在的变量yc
和xc
。它们似乎并不需要,也许它们是从以前版本的代码中保留下来的。摆脱它们。
下一个问题是在flag2
测试中使用if
到最后,这也是未定义的。放弃它。
if
中存在第二个问题,即您正在针对yCoordinate
宽度测试x
,而不是针对y
(并且真的是x
y
名称很差,请考虑将其更改为width
和height
。
有了你,你几乎就在那里。另一个问题(以及主要的逻辑错误)是您在最后一个块中使用elif
,而不是让每个if
独立测试。你希望能够从给定的方格中最多递归四次,只跳过越界的方向。因此,请将elif
转换为常规if
。
哦,您可能希望将>=
用于针对0
的测试,因为这可能是一个有效的坐标!
最后一件事不是错误,但仍可以改进。使用flag
变量的当前代码不必要地复杂化。您可以通过更改第一个if
语句来测试反向(指定的坐标不是"."
,或者可能改为"x"
)来简化它。如果测试成立,您可以执行return
块中当前的else
。之后,您可以无条件地运行所有其余代码(从设置列表值到"x"
开始,然后递归)。这是递归代码的一种非常常见的结构:
def recursive_func(x):
if base_case(x):
return
recursive_func(something(x))