我知道还有其他方法可以避免使用累加器,内置的++
会将一个列表附加到另一个列表中。但是,如果我使用累加器构建我自己的尾递归附加函数,有没有办法在其中一个列表上使用lists:reverse()
,如下面的代码段?感谢
joinWithAccumulator2(X,Y) ->
joinWithAccumulator2(lists:reverse(X), [], Y).
joinWithAccumulator2( [], [], A ) ->
A;
joinWithAccumulator2( [X | Xs], [], A ) ->
joinWithAccumulator2( Xs, [], [ X | A] ).
答案 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.