2010-12-15 101 views
1

lists:sublist/2lists:sublist/3使从列表中提取单个子列表变得简单,但是有没有BiF或模块返回列表的所有列表子列表?将Erlang列表X拆分为所有X的子列表的列表

lists:awesome_sublist_function([1,2,3,4]) -> 
    [[1], [2], [3], [4], [1,2], [1,3], [1,4], 
    [2,3], [2,4], [3,4], [1,2,3], [1,2,4], [1,3,4], [2,3,4], [1,2,3,4]] 

可以建立自己的,但问题是否之前的任何地方解决了怀疑?

+0

没有,但它应该是很容易写。看起来像列表中的工作:展开/ 4 - 不幸的是它还不存在。 – dsmith 2010-12-16 01:00:52

回答

2

我假设你的测试用例遗忘[1,3,4],但它可能是这个样子:

-module(settheory). 
-export([combinations/1]). 

combinations([]) -> 
    []; 
combinations([H | T]) -> 
    CT = combinations(T), 
    [[H]] ++ [[H | L] || L <- CT] ++ CT. 

-include_lib("eunit/include/eunit.hrl"). 
combinations_test() -> 
    ?assertEqual(
     combinations([1,2,3,4]), 
     lists:sort([[1], [2], [3], [4], [1,2], [1,3], [1,4], 
        [2,3], [2,4], [3,4], [1,2,3], [1,2,4], [1,3,4], 
        [2,3,4], [1,2,3,4]])), 
    ok. 
+0

当然可以做这份工作,谢谢! (是的,我错过了[1,3,4] - 现在增加了这个问题)。我要走开并考虑一个尾递归版本。 – majelbstoat 2010-12-16 04:22:27

+0

除了这样做的乐趣之外,我不会花太多时间做这件事,效率的差别可能不会太大。 – rvirding 2010-12-16 10:00:02

+1

你说得对。速度方面,即使在大型名单上也没有太大区别。与堆栈没有太大的区别 - 我想知道这是否因为结果只会被追加。在24个项目的列表中,重复了一百次,尾部呼叫版本的中位数更小,范围更窄,但与平均值没有实质性差异。 (这很有趣:))。 – majelbstoat 2010-12-16 12:06:37