这是学校的一个项目,所以我不想要答案,我只想指出正确的方向,因为我喜欢自己解决问题。但是,我坚持这个。递归对我来说有些意义,但我用得不多。我正在做的是模仿油漆的自动填充功能。所以我会得到一个这样的文件:
....xx....
...x..x...
...x..x...
...x..x...
....xx....
我得到了开始用 X 自动填充矩阵的坐标。我知道如何验证和所有爵士乐,我遇到的麻烦是理解如何不超出我的递归函数的范围。我总是收到一条错误消息,指出发生了最大递归。这是我对该功能的尝试:
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
最佳答案
您的第一个问题是底部和右侧边缘:
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
那个条件是什么?好吧,那是你必须弄清楚的部分。你可以跟踪你正在填充的方向,如果你在那个方向上击中边缘而不是递归,或者跟踪你是否已经从给定点填充(提示:这比听起来容易得多), 或者……
关于Python 使用递归更改列表中的某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20061782/