我试图编写一个函数来获取大小为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]]
另外,我不关心任何事情的顺序。
答案 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的原因:))