编写一个函数来获取Haskell中所有大小为n的子序列?

时间:2012-03-29 06:10:23

标签: haskell functional-programming

我试图编写一个函数来获取大小为n的列表的所有子序列,但我不确定如何去做。

我在想,我可能会使用内置的Data.List.subsequences,只是过滤掉那些不是n大小的列表,但它看起来像是一种相当迂回且低效的方式,而且我'如果我可以避免它,请不要这样做,所以我想知道你是否有任何想法?

我希望它类似于这种类型

subseqofsize :: Int -> [a] -> [[a]]

为了进一步澄清,这是我正在寻找的一个例子:

subseqofsize 2 [1,2,3,3]
[[1,2],[1,3],[2,3],[1,3],[2,3],[3,3]]

另外,我不关心任何事情的顺序。

2 个答案:

答案 0 :(得分:12)

我假设这是作业,或者你正在做这个作为练习的练习,所以我会给你一个解决方案的概述,而不是用勺子喂你正确的答案。 / p>

无论如何,这是一个递归问题。

两个基本情况:

sublistofsize 0 _        = ...
sublistofsize _ []       = ...

然后有两个递归步骤:

sublistofsize n (x : xs) = sublistsThatStartWithX ++ sublistsThatDon'tStartWithX
  where sublistsThatStartWithX = ...
        sublistsThatDon'tStartWithX = ...

请记住,基本案例的定义需要与递归案例中的定义一起使用。仔细想想:不要只假设基本案例都会导致列表为空。

这有帮助吗?

答案 1 :(得分:2)

您可以用数学方式考虑这个问题:要计算大小 k 的子列表,我们可以查看列表中的一个元素 x ;要么子列表包含 x ,要么不包含 x 。在前一种情况下,子列表包含 x ,然后是从其余元素中选择的 k -1个元素。在后一种情况下,子列表由 k 元素组成,这些元素选自不是 x 的元素。这有助于(相当)简单的递归定义。

(与recursive formula for binomial coefficients有非常强烈的相似之处,这是预期的。)

(编辑:删除代码,根据dave4420&#39的原因:))