我试图解决一个问题(练习),我必须编写一个连接给定列表列表中所有元素的函数。换句话说,如果此函数的输入为[[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]
请对此发表评论!
答案 0 :(得分:1)
查看source code的lists: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).