2016-03-24 2 views
1

Я пытаюсь получить результат о том, что будет двойным for-loop на другом языке (например, Java или JavaScript).Суммировать все элементы в списке без повторения уже вычисленных элементов

Так ближайший я могу придумать что-то вроде этого:

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]. 

Другие решения

Вам по существу нужны два итератора, идущих вместе с одной и той же структурой данных и аккумулятором в коллектор 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, который занимается аналогичной проблемой и имеет больше идей для возможных решений.

Смежные вопросы