使用Haskell在元组中拆分列表,其中包含长度为2 ^ 0,2 ^ 1,...,2 ^ N的列表

时间:2017-03-24 10:49:16

标签: list haskell split

我正在尝试解决Haskell问题,但我没有任何线索从哪里开始。 我需要在列表中拆分列表,长度为2 ^ 0,2 ^ 1,2 ^ 3 ..元素。 因此,如果我们在使用函数后有列表[1,2,3,4,5,6,7,8,9,10,11,12,13],那么我们应该得到结果[[1],[2,3],[4,5,6,7],[8,9,10,11,12,13]]

2 个答案:

答案 0 :(得分:4)

您可以使用函数:splitAt :: Int -> [a] -> ([a],[a]),然后使用递归:

blocks :: Int -> [a] -> [[a]]
blocks _ [] = []
blocks n ls = la : blocks (2*n) lb
    where ~(la,lb) = splitAt n ls

因此,如果我们有blocks 1 [1,2,3,4,5,6],我们将获得[[1],[2,3],[4,5,6]]。在第一种情况下,我们查看我们给块的列表是否为空,在这种情况下,没有什么可以拆分,所以我们返回空列表。在递归的情况下,我们splitAtls列表导入lalbla是我们的第一个列表,lb我们需要进一步拆分。我们使用n*2作为新的分割长度进行递归,以确保列表的长度将像2的幂一样增加。

答案 1 :(得分:1)

也许您也可以使用zipgroupBy。似乎工作,但不是那么简单。

import Data.List
a="Hello World!"
p=[2^n| n<-[0..]]
pa=take (length a) p
b=[elem n pa| n<-[1..length a]]
c=zip a b
d=groupBy (\x y->snd y==False) c
e=map (map (\x->fst x)) d