【问题标题】:print matrix in spiral order recursively以递归方式以螺旋顺序打印矩阵
【发布时间】:2018-02-07 03:50:00
【问题描述】:

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

假设我有这个矩阵:

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

我的函数应该打印...

 HELLIFEASTTONIERG

这是我的代码...

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

但这是不正确的。是否有可能以某种方式改变我的功能以获得正确的输出,因为我觉得我很接近。还是有其他递归解决方案?

【问题讨论】:

    标签: python algorithm recursion matrix


    【解决方案1】:

    这是一个递归解决方案,逐层解决,从最外层开始,顺时针:

    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)
    

    【讨论】:

      【解决方案2】:

      简单干净的做螺旋(Python 3+)

      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)))
      

      【讨论】:

        猜你喜欢
        • 2018-03-23
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多