作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在本练习中,我应该编写一个函数,该函数接收整数列表作为参数并给出矩阵或列表列表。制作矩阵的要点在于,整数代表矩阵每列中 True
的数量。例如
[2,4,1]
必须翻译为:
在系统中表示为列表的列表:
[ [0,1,0], [0,1,0], [1,1,0], [1,1,1] ]
由于按列操作矩阵(列表列表)并不容易,因此我使用了一个技巧,使用 transpose
将矩阵向左旋转 90 度,这使得矩阵如下所示:
然后我开发了以下算法来解决这个问题:
最大xs
的列表(每个列表的长度等于列表中的最大元素)True
。False
填写列表的其余部分我尝试实现两种解决方案,但每个解决方案都有一个我无法解决的问题:
这个适用于第一个元素,但我不知道如何将其应用于输入列表的所有元素
listToMatrix x = (replicate ((maximum x) - (head x)) False) ++ (replicate (head x) True)`
这适用于所有元素,但无法保留内部列表的长度,因此列表具有不同的长度。
listToMatrix lst@(x:xs) = ((replicate ((maximum lst) - x) False) ++ (replicate x True)) : listToMatrix xs`
问题 1:如何通过最少的更改使这些功能正常工作?
问题 2:是否有更优雅、更紧凑的解决方案?
附注我在矩阵中使用了 1 和 0 来使它们更具可读性,但它们实际上是 True 和 False
最佳答案
我会使用以下方法,该方法与您的方法兼容。
正如您所建议的,我们在最后使用转置
,因为转置矩阵看起来更容易生成。
f :: [Int] -> [[Bool]]
f xs = transpose (...)
然后,xs
的每个元素都必须生成一个新行。我们可以使用列表理解(如下完成),或者使用 map
。
f :: [Int] -> [[Bool]]
f xs = transpose [ row x | x <- xs ]
where row :: Int -> [Bool]
row x = ...
正如您所建议的,我们还需要 maximum
来生成每一行,因此我们计算一次:
f :: [Int] -> [[Bool]]
f xs = transpose [ row x | x <- xs ]
where m = maximum xs
row :: Int -> [Bool]
row x = ... -- we know x and m, we need m-x Falses and x Trues
现在,您只需调整代码即可。
关于haskell - 如何在 Haskell 中将整数列表转换为 True 和 False 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33986050/
我是一名优秀的程序员,十分优秀!