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