使用递归以螺旋模式遍历2D阵列

Chi*_*ser 5 arrays recursion 2d spiral

我正准备接受采访,并且已经坚持这个问题了很长一段时间了.有人可以帮我提供代码.如果不完整那么可能是它的片段?请..

Ste*_*202 19

Python 2,从左上角到中心以顺时针方向打印2D嵌套列表:

>>> def clockwise(r):
...     return list(r[0]) + clockwise(list(reversed(zip(*r[1:])))) if r else []
... 
>>> a = [ 
...   [ 1,  2,  3], 
...   [ 5,  6,  7], 
...   [ 9, 10, 11]]
>>> clockwise(a)
[1, 2, 3, 7, 11, 10, 9, 5, 6]
>>> a = [ 
...   [ 1,  2,  3,  4], 
...   [ 5,  6,  7,  8], 
...   [ 9, 10, 11, 12],
...   [13, 14, 15, 16]]
>>> clockwise(a)
[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]
Run Code Online (Sandbox Code Playgroud)

那么这里发生了什么?参数clockwise是一个二维数组r.我们想要从左到右顺时针打印它的内容.因此,如果二维数组不为空,那么我们可以打印它的第一个元素,即第一行.接下来,我们要打印剩余行的最后一个元素(右边的数字).我们不想重复自己.所以我们所做的是转换剩余的行,使得下一个要打印的数字位于顶行.我们通过转置剩余的行(使它们成为列)然后将它们反转来完成此操作.

如果我在Haskell中编写它,算法可能会变得更清晰:

import Data.List

clockwise :: [[a]] -> [a] 
clockwise (x:xs) = x ++ (clockwise $ reverse $ transpose $ xs) 
clockwise _      = []
Run Code Online (Sandbox Code Playgroud)