Erlang中的嵌套总和

Lui*_*nda 2 erlang list

我怀疑如何添加列表的数量,包括嵌套列表中的列表,例如:

test:nestedSum([1, [2, 3], [4, 5, 6], 7]).
? 28
Run Code Online (Sandbox Code Playgroud)

到目前为止我得到了这个:

nestedSum(L) -> nestedSum(L, 0).

nestedSum([H|T], Acc) -> 
nestedSum(T, H + Acc); 

 nestedSum([], Acc) ->
Acc. 
Run Code Online (Sandbox Code Playgroud)

哪个只有作用:

test:nestedSum([1, 2, 3, 4, 5, 6, 7]). 
? 28
Run Code Online (Sandbox Code Playgroud)

但它并没有对嵌套总和中的数字求和,我该怎么做?

Dog*_*ert 6

nestedSum/2当列表的头部是列表时,您只需要为该函数添加一个子句:

% Add this before the two existing clauses.
nestedSum([H|T], Acc) when is_list(H) ->
  nestedSum(T, nestedSum(H) + Acc);
Run Code Online (Sandbox Code Playgroud)

有了这个,您的函数现在可以处理任何嵌套列表:

1> a:nestedSum([1, [2, 3], [4, 5, 6], 7]).
28
2> a:nestedSum([1, [2, 3], [4, 5, 6], 7, [8, [[[9, [[[[[[10]]]]]]]]]]]).
55
Run Code Online (Sandbox Code Playgroud)


ton*_*nys 5

您可以使用列表:展平:

nestedSum(L) -> nestedSum(lists:flatten(L), 0).
.
.
Run Code Online (Sandbox Code Playgroud)

减少列表通常是一个单一的:

lists:foldl(fun(X,Sum) -> X + Sum end, 0, lists:flatten([1, [2, 3], [4, 5, 6], 7])).
Run Code Online (Sandbox Code Playgroud)