使用模式匹配将列表减半为子列表

时间:2018-10-25 17:34:15

标签: haskell

在给定输入的情况下,我试图获取输出

> halve [1,2,3,4,5,6]
([1,2,3],[4,5,6])

我已经使用这种方法解决了这个问题:

halve xs = ((take s xs), (drop s xs))
    where
      s = (length xs) `div` 2

我是Haskell的初学者,我想学习如何使用模式匹配解决此问题?谢谢

1 个答案:

答案 0 :(得分:5)

您可以使用hare and tortoise algorithm的变体。该算法基本上是通过两个迭代器在列表上运行的:兔子一次进行两次跳跃,而草龟则一次进行跳跃。

当野兔到达列表的末尾时,我们知道乌龟已经中途了,因此可以将列表分成两半:到目前为止看到的列表是前半部分,还有待枚举的列表是下半场。

因此,算法如下:

half :: [a] -> ([a], [a])
half h = go h h
    where go (_:(_:hs)) (t:ts) = (..., ...)
              where (a, b) = go ...
          go _ (t:ts) = (..., ...)
          go _ [] = (..., ...)

还有...个部分仍要填写。