Arrays 使用递归以螺旋模式遍历二维数组

Arrays 使用递归以螺旋模式遍历二维数组,arrays,recursion,2d,spiral,Arrays,Recursion,2d,Spiral,我正在准备面试,这个问题已经困扰了我很长一段时间了。谁能帮我查一下密码吗。如果不完整,那么可能是它的一个片段? 请..Python 2从左上角到中心顺时针打印二维嵌套列表: >>> def clockwise(r): ... return list(r[0]) + clockwise(list(reversed(zip(*r[1:])))) if r else [] ... >>> a = [ ... [ 1, 2, 3], ...

我正在准备面试,这个问题已经困扰了我很长一段时间了。谁能帮我查一下密码吗。如果不完整,那么可能是它的一个片段?
请..

Python 2从左上角到中心顺时针打印二维嵌套列表:

>>> 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]
那么这里发生了什么?顺时针
的参数是一个二维数组
r
。我们想从左到右顺时针打印它的内容。因此,如果二维数组不是空的,那么我们可以打印它的第一个元素,也就是最上面的一行。接下来,我们要打印剩余行的最后一个元素(右边的数字)。我们不想重复我们自己。所以我们要做的是,变换剩下的行,使下一个要打印的数字在第一行。我们通过转置剩余的行(使它们成为列)然后反转它们来实现这一点

如果我用Haskell写的话,算法可能会更清晰:

import Data.List

clockwise :: [[a]] -> [a] 
clockwise (x:xs) = x ++ (clockwise $ reverse $ transpose $ xs) 
clockwise _      = []

很好的回答!但我对所使用的方法和算法更感兴趣。请帮忙。