Erlang将一个列表追加/连接到另一个列表

时间:2017-08-05 21:28:09

标签: functional-programming erlang tail-recursion

我知道还有其他方法可以避免使用累加器,内置的++会将一个列表附加到另一个列表中。但是,如果我使用累加器构建我自己的尾递归附加函数,有没有办法在其中一个列表上使用lists:reverse(),如下面的代码段?感谢

joinWithAccumulator2(X,Y) ->
    joinWithAccumulator2(lists:reverse(X), [], Y).

joinWithAccumulator2( [], [], A ) ->
    A;

joinWithAccumulator2( [X | Xs], [], A ) ->
    joinWithAccumulator2( Xs, [], [ X |  A] ).

1 个答案:

答案 0 :(得分:0)

构建列表的最快方法是使用[H | T]预先添加元素。所以你这样做的方式很有效率。如果您的目的是避免使用lib库,并且为了使用累加器(请参阅@ juan.facorro注释),您可以先将累加器中的第一个列表反转,然后将其添加到第二个列表中:

joinWithAccumulator2(LX, LY) ->
    joinWithAccumulator2(LX, LY, []).

% first step reverse LX in LA
joinWithAccumulator2( [X | Xs], LY, LA ) ->
    joinWithAccumulator2( Xs, LY, [X |  LA] );
% second step, when LX is empty, prepend LA to LY (list accumulator2)
joinWithAccumulator2( [], LA2, [A | As] ) ->
    joinWithAccumulator2( [], [A | LA2], As );
% operation done
joinWithAccumulator2( [], A, [] ) ->
    A.
相关问题