Python使用递归来更改列表中的某些值

时间:2013-11-19 02:06:13

标签: python recursion

这是一个学校的项目,所以我不想要答案,我只想要一个正确的方向,因为我喜欢为自己搞清楚事情。但是,我坚持这个。递归对我来说有点意义,但我没有太多使用它。我正在做的是模仿油漆的自动填充功能。所以我会得到一个这样的文件:
.... 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

3 个答案:

答案 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周围的边界已经创建(虽然如果这是你想要做的,我很抱歉误解)。

这是一个常见的计算问题,称为“洪水填充问题”。完成任务后,您可能需要考虑查找一些很酷的方法来实现这一点,既快速又更有效地使用内存。