Python用递归填充2D列表

时间:2014-04-21 02:25:51

标签: python recursion

我需要创建一个递归填充2D列表的程序。该列表形成一个像

的网格
I - I - I - - - 
I I - - - - - - 
I I I I - - - - 

然后用户输入列号和行号。该程序然后填写" - "与" @"。因此,如果row = 1且column = 4,它将如下所示:

I - I @ I @ @ @
I I @ @ @ @ @ @
I I I I @ @ @ @ 

我必须通过递归来做到这一点。我唯一可以做到的就是部分填充。请帮我。

2 个答案:

答案 0 :(得分:1)

如果从网格的右下角开始并向后递归到(0,0),程序非常简单。让我们一步一步地走过逻辑:

  • 我们从右下角开始,在你的情况下(2,7)。在你的情况下(0,3)你需要填充大于你边界的所有东西。这些是递归方法所需的参数。

    recur_fill(input_list, a, b, i, j)
    
  • 我们从边界条件开始。只有在坐标大于零时才需要执行程序。即,如果i < 0j < 0我们必须停止。这转化为:

    if i < 0 or j < 0:
        return
    
  • 现在,我们需要处理油漆界限,即a和b。只要我们的坐标大于您的界限,我们就需要检查单元格是否有-并填充@。转换为:

    if i >= a and j >= b:
        if input_list[i][j] == '-':
            input_list[i][j] = '@'
    
  • 现在,我们需要递归填充细胞,直到满足我们条件下的所有细胞。即,

    recur_fill(input_list, a, b, i - 1, j)
    recur_fill(input_list, a, b, i, j - 1)
    

总结这些,我们有:

from pprint import pprint

def recur_fill(input_list, a, b, i, j):
    if i < 0 or j < 0:
        return

    if i >= a and j >= b:
        if input_list[i][j] == '-':
            input_list[i][j] = '@'

    recur_fill(input_list, a, b, i - 1, j)
    recur_fill(input_list, a, b, i, j - 1)

def main():
    input_list = [['I', '-', 'I', '-', 'I', '-', '-', '-' ],
                  ['I', 'I', '-', '-', '-', '-', '-', '-' ],
                  ['I', 'I', 'I', 'I', '-', '-', '-', '-' ]]
    recur_fill(input_list, 0, 2, 2, 7)
    pprint(input_list)


if __name__ == '__main__':
    main()

答案 1 :(得分:0)

input_list = [['I', '-', 'I', '-', 'I', '-', '-', '-' ],
              ['I', 'I', '-', '-', '-', '-', '-', '-' ],
              ['I', 'I', 'I', 'I', '-', '-', '-', '-' ]]

def fill(x, y):
    if 0 <= x < len(input_list[0]) and 0 <= y < len(input_list) and input_list[y][x] == '-':
        input_list[y][x] = '@'
        fill(x, y + 1)
        fill(x, y - 1)
        fill(x + 1, y)
        fill(x - 1, y)
    return

这将通过移动4个邻居来搜索要填充的点。

注意这是x-y坐标(0开始)。因此,如果您想使用行列坐标(1个开始),只需将其转换为:

fill(column - 1, row - 1)