2016-03-24 10 views
1

私は、別の言語(JavaやJavaScriptなど)でdouble for-loopの結果を得ようとしています。まだ計算されていない要素を繰り返さずにリスト内のすべての要素を集計します。

は、だから私が思い付くことができます最も近いが、このようなものです:

1> L = [1,2,3]. 
[1,2,3] 
2> R = [X + Y || X <- L, Y <- L]. 
[2,3,4,3,4,5,4,5,6] 
3> 

...しかし、私が本当にやりたいことはある:[3,4,5]。私はすでに追加された要素を合計する必要はありません。事前に

A1 + A2 
A2 + A3 
A2 + A1 [already computed, position switched] 
A2 + A3 [already computed, position switched] 
A3 + A1 
A3 + A2 [already computed, position switched] 

おかげで...

答えて

3

TLを、DR

[X+Y || X <- L, Y <- L, Y > X]. 

他のソリューション

基本的に、2つのイテレーターを同じデータ構造の上を歩き、アキュムレータをcolleにする必要があります特有の要素のct合計。あなたはErlangで、このようなイテレータを模倣することはできません理由はない:

-module(sum2). 
-export([start/1]). 

start(Max) -> 
    L = lists:seq(1, Max), 
    T = list_to_tuple(L), 
    do_sum(T, 1, 2, size(T), []). 

do_sum(T, X, S, S, A) when X + 1 =:= S -> 
    lists:reverse([mk_sum(X, S, T) | A]); 
do_sum(T, X, S, S, A) -> 
    do_sum(T, X + 1, X + 2, S, [mk_sum(X, S, T) | A]); 
do_sum(T, X, Y, S, A) -> 
    do_sum(T, X, Y + 1, S, [mk_sum(X, Y, T) | A]). 

mk_sum(X, Y, T) -> element(X, T) + element(Y, T). 

結果:

あなたがリストを持っていない場合は簡単な解決策は、実際にあり
7> c(sum2). 
{ok,sum2} 
8> sum2:start(3). 
[3,4,5] 
9> sum2:start(5). 
[3,4,5,6,5,6,7,7,8,9] 

あなたは合計する要素が、ちょうど整数:

-module(sum3). 
-export([start/1]). 

start(Max) -> do_sum(1, 2, Max, []). 

do_sum(X, S, S, A) when X + 1 =:= S -> lists:reverse([X + S | A]); 
do_sum(X, S, S, A) -> do_sum(X + 1, X + 2, S, [X + S | A]); 
do_sum(X, Y, S, A) -> do_sum(X, Y + 1, S, [X + Y | A]). 

それとも、リスト内包しても、簡単な解決策:

4> L = [1, 2, 3]. 
[1,2,3] 
5> [X+Y || X <- L, Y <- L, Y > X]. 
[3,4,5] 
6> f(). 
ok 
7> L = [1,2,3,4,5]. 
[1,2,3,4,5] 
8> [X+Y || X <- L, Y <- L, Y > X]. 
[3,4,5,6,5,6,7,7,8,9] 

また、同様の問題に取り組み、可能な解決策についてより多くのアイデアを持っているErlang; list comprehension without duplicatesもチェックしてください。

関連する問題