2010-12-15 6 views
1

lists:sublist/2およびlists: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

ありませんが、書くのに十分な簡単なはずです。リストのための仕事のように見える:unfold/4 - 残念ながらそれはまだ存在しない。 – dsmith

答えて

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

+0

それをやっている楽しみから離れて、私はこれをやるのにあまり時間を費やしませんでした。効率の違いはあまりないでしょう。 – rvirding

+1

あなたはそうです。大量のリストであっても、スピードに敏感で、違いはほとんどありません。スタックとの大きな違いはありません。なぜなら、結果は単にとにかく追加されるからです。 24項目のリストに100回繰り返し、テールコールバージョンのメジアンとタイトな範囲は小さくなりましたが、平均と実際の差はありませんでした。 (それは面白かった:))。 – majelbstoat