获取包含数字的列表并将其转换为最小/最大版本

问题描述 投票:-1回答:1

获取一个数字列表,然后创建另一个列表,其中包括通过选择一个最小数和一个最大数直到列表中没有数字来创建一对。

输入:

[3,6,1,8,7,9,12,4]

输出:

[(1,12),(3,9),(4,8),(6,7)]

如何做到这一点?

我应该使用transposefromIntegral功能吗?

haskell haskell-stack
1个回答
0
投票

一个简单的解决方案。请注意,如果列表的长度为奇数,它将删除中间元素。

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)]
© www.soinside.com 2019 - 2024. All rights reserved.