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

标签 python recursion

这是学校的一个项目,所以我不想要答案,我只想指出正确的方向,因为我喜欢自己解决问题。但是,我坚持这个。递归对我来说有些意义,但我用得不多。我正在做的是模仿油漆的自动填充功能。所以我会得到一个这样的文件:
....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/

相关文章:

python - 分析 Python 脚本时按 percall 对 cProfile 输出进行排序

python peewee 原始查询,不转义字符

r - R中的尾递归

list - 在 Prolog 中使用递归创建数据列表

python - NumPy 中的累积加法/乘法

使用 rolling_apply 的 Python 自定义函数用于 pandas

python - 在Python中引发异常时可以更改 "recent call"堆栈吗?

python - 如何根据非字母名称对带有 Pandas 的行进行排序

java - java中将每个数字与整数分开的递归数

python - 为什么我的递归函数更新列表(计算 n 的斐波那契)