连接列表列表

时间:2016-08-06 17:33:04

标签: erlang

我试图解决一个问题(练习),我必须编写一个连接给定列表列表中所有元素的函数。换句话说,如果此函数的输入为[[1,2], [3,4]],则输出应为[1,2,3,4](顺序并不重要)。

我能够通过使用下面的代码来实现它,但我想知道它是否效率低下或者可以变得更优雅。

%% To achieve this, we use a helper function and an accumulator %%
% Append elements of Src list into Dest list
append_list([], Dest) -> Dest;
append_list([H|T], Dest) -> append_list(T, [H|Dest]).

concatenate_acc([H|T], FinalList) -> 
    FinalList1 = append_list(H, FinalList),
    concatenate_acc(T, FinalList1);
concatenate_acc([], FinalList) -> FinalList.

concatenate(L) -> concatenate_acc(L, []).

示例输出:

exercises2:concatenate([[1,2], [3,4]]).
[2,1,3,4]

请对此发表评论!

1 个答案:

答案 0 :(得分:1)

查看source codelists:append/1可以提供您所需要的内容,但我想以更简单的方式。

append([E]) -> E;
append([H|T]) -> H ++ append(T);
append([]) -> [].

如果Erlang模块中已经有一个已实现的函数,那么查看源代码总是一个好习惯。

您可以进行一些小修改,使其成为尾递归。请注意,累加器Acc位于++运算符的右侧。

append2(List) -> append2(List,[]).
append2([], Acc) -> Acc;
append2([H|T],Acc) -> append2(T, H ++ Acc).