我正在尝试从接收Int(i)的函数将列表转换为数组(列表的列表),该Int(i)始终是从0开始的计数器,而另一个Int(n)则是每个数组的长度行和要转换为矩阵的列表。
createMatrix :: (Int, Int, [Int]) -> [[Int]]
createMatrix (i, n, ([])) = []
createMatrix (i, n, (x:y)) = if (i < n) then [x] : createMatrix (i+1, n, (y))
else [] ++ createMatrix (0, n, (x:y))
这给出了我的输出:
[[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18]]
什么时候应该是这样的:
[[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18]]
如果n为6
有人认为我可能会失败吗?我尝试了几件事,但没有找到解决方法。
谢谢
答案 0 :(得分:2)
编写[x]:createMatrix (...)
时,您总是在输出中添加一个完整的新列表。而且,当您执行[] ++ createMatrix (...)
时,您并没有对结果做任何事情; concat
空列表无济于事。
您想将x
放在createMatrix (...)
结果的第一个列表中,而不是将[x]
放在整个结果的前面。
在else
情况下,您希望添加一个新的空列表,而不是尝试使用将两个列表连接在一起的++
。
答案 1 :(得分:1)
没有counter
且仅对每个给定的n
拆分列表的替代解决方案:
matrixEvery :: Int -> [a] -> [[a]]
matrixEvery _ [] = []
matrixEvery n xs = as : matrixEvery n bs
where (as,bs) = matrixEvery n xs
使用递归而不是传递计数器。 唯一的失败是,如果您想使矩阵的大小都相等,那将行不通,但请您靠近:)