获取一个数字列表,然后创建另一个列表,其中包括通过选择一个最小数和一个最大数直到列表中没有数字来创建一对。
输入:
[3,6,1,8,7,9,12,4]
输出:
[(1,12),(3,9),(4,8),(6,7)]
如何做到这一点?
我应该使用transpose
和fromIntegral
功能吗?
一个简单的解决方案。请注意,如果列表的长度为奇数,它将删除中间元素。
import Data.List(sort)
fun :: Ord a => [a] -> [(a, a)]
fun l =
let x = sort l
in take (length l `div` 2) (zip x (reverse x))
首先,我们以升序对l
进行排序。因此,请考虑您的示例[3,6,1,8,7,9,12,4]
:
x == [1,3,4,6,7,8,9,12]
我们zip
x
反转了x
:
zip x (reverse x) == [(1,12),(3,9),(4,8),(6,7),(7,6),(8,4),(9,3),(12,1)]
然后我们获取元素的前一半,即length l `div` 2
:
take (length l `div` 2) (zip x (reverse x))
== [(1,12),(3,9),(4,8),(6,7)]