按螺旋顺序递归打印矩阵

2024-04-19 00:11:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我找到的所有答案都是提出迭代解决方案。有没有递归的方法来解决这个问题?我有一个似乎很接近但还不完全正确的尝试。在

假设我有这个矩阵:

matrix = [
    ["H", "E", "L", "L"], 
    ["N", "I", "E", "I"], 
    ["O", "G", "R", "F"], 
    ["T", "S", "A", "E"]
    ]

我的函数应该打印。。。在

^{pr2}$

这是我的密码。。。在

def spiral(matrix, i, j):

    if i < 0  or j < 0 or i >= len(matrix) or j >= len(matrix) or matrix[i][j] == False:
        return False

    print(matrix[i][j])
    matrix[i][j] = False

    if j < len(matrix) and j >= i:
        spiral(matrix, i, j+1)

    if i < len(matrix) and i <= j:
        spiral(matrix, i+1, j)

    if j >= 0 and j <= i:
        spiral(matrix, i , j-1)

    if i >= 0 and i >= j:   
        spiral(matrix, i-1, j)

spiral(matrix, 0, 0)

它有点螺旋形。。。在

HELLIFEASTONGIER

但这是不正确的。有没有可能改变我的函数,以获得正确的输出,因为我觉得我好像接近了。或者还有其他递归解决方案吗?在


Tags: orand方法函数答案false密码len
2条回答

简单而干净的螺旋形(Python3+)

def spiralOrder(matrix):
        return matrix and [*matrix.pop(0)] + spiralOrder([*zip(*matrix)][::-1])

ab = [
    ["H", "E", "L", "L"], 
    ["N", "I", "E", "I"], 
    ["O", "G", "R", "F"], 
    ["T", "S", "A", "E"]
    ]
print(''.join(spiralOrder(ab)))

下面是一个逐层解决问题的递归解决方案,从最外层开始,顺时针:

def spiral(matrix, level=0):
    m, n = len(matrix), len(matrix[0])  # MxN matrix

    if level >= m // 2 and level >= n // 2:
        return # no more layer to solve

    left, right, top, bottom = level, n - 1 - level, level, m - 1 - level
    for j in range(left, right):
        print(matrix[top][j])

    for i in range(top, bottom):
        print(matrix[i][right])

    for j in range(right, left, -1):
        print(matrix[bottom][j])

    for i in range(bottom, top, -1):
        print(matrix[i][left])

    spiral(matrix, level=level + 1)

相关问题 更多 >