这个二维列表长这样:
1 | 2 | 3
- - - - -
4 | 5 | 6
- - - - -
7 | 8 | 9
或者使用纯 Haskell
[ [1,2,3], [4,5,6], [7,8,9] ]
diagonals [ [1,2,3], [4,5,6], [7,8,9] ]
的期望输出结果是:
[ [1], [4, 2], [7, 5, 3], [8, 6], [9] ]
编写 allDiagonals
(包括反对角线)然后就很简单:
allDiagonals :: [[a]] -> [[a]]
allDiagonals xss = (diagonals xss) ++ (diagonals (rotate90 xss))
我对这个问题的研究
在StackOverflow上有类似的问题
Python 这个问题是关于Python中相同的问题,但Python和Haskell非常不同,因此那个问题的答案对我不相关。
只有一个 这个问题和答案都是关于Haskell的,但只涉及到了中央对角线。
Hoogle
搜索[[a]] -> [[a]]
没有得到任何有趣的结果。
独立思考
我认为索引遵循一种基于矩阵维度数x的计数方式,在这里x表示矩阵的维度数,可以看下面的内容:
1 | 2
- - -
3 | 4
对角线为 [ [1], [3, 2], [4] ]
1
可以在matrix[0][0]
找到3
可以在matrix[1][0]
找到2
可以在matrix[0][1]
找到1
可以在matrix[1][1]
找到
这类似于将二进制数从0到3计数,即矩阵大小减一。但这种方法太过模糊,无法转换成代码。
diagonals
的结果,我们如何构造整个原始矩阵上diagonals
的结果? - Reid Barton