这是一个学校的项目,所以我不想要答案,我只想要一个正确的方向,因为我喜欢为自己搞清楚事情。但是,我坚持这个。递归对我来说有点意义,但我没有太多使用它。我正在做的是模仿油漆的自动填充功能。所以我会得到一个这样的文件:
.... XX ....
... ... x..x
... ... x..x
... ... x..x
.... xx ....
我获得了坐标,从中开始用X' s开始自动填充矩阵。我知道如何验证和所有爵士乐,我遇到的麻烦是理解如何不通过我的递归功能超出范围。我总是收到一个错误,说最大的递归发生。以下是我对该功能的尝试:
def autoFill(x, y, rows, columns, matrix):
if(matrix[y][x] == "."):
matrix[y][x] = "x"
if(y-1 >= 0):
autoFill(x, y-1, rows, columns, matrix)
elif(y+1 <= rows):
autoFill(x, y+1, rows, columns, matrix)
elif(x-1 >= 0):
autoFill(x-1, y, rows, columns, matrix)
elif(x+1 <= columns):
autoFill(x+1, y, rows, columns, matrix)
return matrix
答案 0 :(得分:0)
如果你填写了当前位置,你应该只递归。如果当前位置已经是“x”,则停止递归。
P.S。这就是我喜欢编码这个特定模式的方式,在一个地方完成边界检查,而不是每次递归调用。
def autoFill(x, y, rows, columns, matrix):
if x < 0 or y < 0 or x >= columns or y >= rows:
return
if matrix[y][x] != '.':
return
matrix[y][x] = 'x'
autoFill(x - 1, y, rows, columns, matrix)
autoFill(x + 1, y, rows, columns, matrix)
autoFill(x, y - 1, rows, columns, matrix)
autoFill(x, y + 1, rows, columns, matrix)
答案 1 :(得分:0)
你的第一个问题是底边和右边:
elif(y+1 <= rows):
autoFill(x, y+1, rows, columns, matrix)
范围是从0到rows
,不的所有数字,包括rows
。因此,当y+1 == rows
时,y=1
超出范围。因此,您需要将<=
更改为<
。
你的第二个问题是你没有基本案例。这四个条件中的一个将始终为真(除非rows == columns == 0
),因此您将始终递归,这意味着您可以保证无限递归。
您需要一些不递归的条件。例如:
if <some condition in which you don't need to go any further>:
return
# now do the rest of your code
是什么那个条件?那么,这是你必须弄清楚的部分。您可以跟踪您正在填充的方向,如果您在该方向上碰到边缘,则不会递归,或者跟踪您是否已经从给定点填充(提示:那个比听起来容易得多) ),或......
答案 2 :(得分:0)
你的问题是你的程序将无限地来回递送 - 此外,程序根本不考虑边界 - 即使程序完成它也相当于完全填充x,而不是X周围的边界已经创建(虽然如果这是你想要做的,我很抱歉误解)。
这是一个常见的计算问题,称为“洪水填充问题”。完成任务后,您可能需要考虑查找一些很酷的方法来实现这一点,既快速又更有效地使用内存。