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

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

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

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

最佳答案

建立列表的最快方法是使用[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.

关于functional-programming - Erlang将一个列表追加/合并到另一个列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45526557/

10-09 14:43