递归函数在矩阵中改变<x和=“”y =“”>?</x>

时间:2013-11-24 06:18:14

标签: python recursion

好吧我必须写一个像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

2 个答案:

答案 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)

我看到了一些问题。

首先,您在递归调用中引用了几个不存在的变量ycxc。它们似乎并不需要,也许它们是从以前版本的代码中保留下来的。摆脱它们。

下一个问题是在flag2测试中使用if到最后,这也是未定义的。放弃它。

if中存在第二个问题,即您正在针对yCoordinate宽度测试x,而不是针对y(并且真的是x y名称很差,请考虑将其更改为widthheight

有了你,你几乎就在那里。另一个问题(以及主要的逻辑错误)是您在最后一个块中使用elif,而不是让每个if独立测试。你希望能够从给定的方格中最多递归四次,只跳过越界的方向。因此,请将elif转换为常规if

哦,您可能希望将>=用于针对0的测试,因为这可能是一个有效的坐标!

最后一件事不是错误,但仍可以改进。使用flag变量的当前代码不必要地复杂化。您可以通过更改第一个if语句来测试反向(指定的坐标不是".",或者可能改为"x")来简化它。如果测试成立,您可以执行return块中当前的else。之后,您可以无条件地运行所有其余代码(从设置列表值到"x"开始,然后递归)。这是递归代码的一种非常常见的结构:

def recursive_func(x):
    if base_case(x):
        return

    recursive_func(something(x))