首页 > Erlang并发教程 > 4.4 Erlang并发编程-常用列表处理函数reverse
2013
11-06

4.4 Erlang并发编程-常用列表处理函数reverse

reverse

reverse(L)用于颠倒列表L中的元素顺序。

reverse(L) -> reverse(L, []).

reverse([H|T], Acc) ->
    reverse(T, [H|Acc]);
reverse([], Acc) ->
    Acc.

reverse(L)利用一个辅助函数reverse/2将最终结果累积到第二个参数中。

调用reverse(L, Acc)时,若L是一个非空列表,则将L的第一个元素移除并添加Acc的头部。因此对reverse([x,y,z], Acc)的调用将导致reverse([y,z], [x|Acc])的调用。最终reverse/2的第一个参数将归结为一个空列表,这时reverse/2的第二个子句将被匹配并另函数结束。

整个过程如下:

> lists:reverse([a,b,c,d]).
(0)lists:reverse([a,b,c,d])
(1).lists:reverse([a,b,c,d], [])
(2)..lists:reverse([b,c,d], [a])
(3)...lists:reverse([c,d], [b,a])
(4)....lists:reverse([d], [c,b,a])
(5).....lists:reverse([], [d,c,b,a])
(5).....[d,c,b,a]
(4)....[d,c,b,a]
(3)...[d,c,b,a]
(2)..[d,c,b,a]
(1).[d,c,b,a]
(0)[d,c,b,a]
[d,c,b,a]

delete_all

delete_all(X, L)用于删除列表L中出现的所有X

delete_all(X, [X|T]) ->
    delete_all(X, T);
delete_all(X, [Y|T]) ->
    [Y | delete_all(X, T)];
delete_all(_, []) ->
    [].

delete_all所使用的递归模式与memberappend类似。

delete_all的第一个子句在要删除的元素出现在列表的头部时匹配。


留下一个回复

你的email不会被公开。