2017-11-04 9 views
0

私はErlangのリスト:[0, 4, 3, 0]を持っています。リストのインデックスに基づいて、同じ順列を繰り返さずにすべての組み合わせを見つけようとしています。Erlang - 同じインデックスを繰り返さないリストインデックスの置換

例えば、私が探している最終結果は[{0,4}, {0,3}, {0,0}, {4,3}, {4,0}, {3,0}]です。

...または私は iは、リストのインデックスを表すと、行列にリストの組み合わせを置くならば、これは結果のようになります。

 
    {i[0], i[1]}, {i[0], i[2]}, {i[0], i[3]} 
    
         
 
  
          {i[1], i[0]}
         
 , {i[1], i[2]}, {i[1], i[3]} 
    
         
 
  
          {i[2], i[0]}, {i[2], i[1]}
         
 , {i[2], i[3]} 
    
         
 
  
          {i[3], i[0]}, {i[3], i[1]}, {i[3], i[2]}
         
  

私はリストの内包表記をしようとしているが、今まで運がなかった:

[email protected]:~/erlang$ erl 
Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [kernel-poll:false] 

Eshell V9.1 (abort with ^G) 
1> L = [0, 4, 3, 0]. 
[0,4,3,0] 
2> [{X, Y} || X <- L, Y <- L, X < Y].         
[{0,4},{0,3},{3,4},{0,4},{0,3}] 
3> [{X, Y} || X <- L, Y <- L, X > Y]. 
[{4,0},{4,3},{4,0},{3,0},{3,0}] 
4> [{X, Y} || X <- L, Y <- L].  
[{0,0}, {0,4}, {0,3}, {0,0}, 
{4,0}, {4,4}, {4,3}, {4,0}, 
{3,0}, {3,4}, {3,3}, {3,0}, 
{0,0}, {0,4}, {0,3}, {0,0}] 
5> 

答えて

4

これは再帰で行うことができます。以下のコードのアルゴリズムは次のとおりです。リストから始めます。それぞれの呼び出しで、リストの先頭と末尾の各要素を結合します。その後、リストの末尾に再帰します。

combinations([]) -> []; 
combinations([Head | Tail]) -> [{Head, X} || X <- Tail] ++ combinations(Tail). 
1> a:combinations([0, 4, 3, 0]). 
[{0,4},{0,3},{0,0},{4,3},{4,0},{3,0}]