如何删除列表的元素?

时间:2016-12-01 20:13:04

标签: erlang

我已经实现了一个逐个删除列表元素的函数:

remove(_,[])->
  [];
remove(Elem, L)->
  Rest = lists:delete(Elem,L),
  remove(Elem,Rest).

但是当我尝试这个例子时它会挂起:

L = [1,2,3,4].
remove(hd(L), [L]).

它有什么问题。或者是否有更好的方法从列表的第一个元素开始逐个删除列表中的元素。

3 个答案:

答案 0 :(得分:1)

您还可以使用lists模块,它定义了许多有用的功能。

以你的情况为例:

1> A = [1,2,3,4,5,6,7,8,9,10].
[1,2,3,4,5,6,7,8,9,10]
2> B = [2,3,4].
[2,3,4]
3> lists:filter(fun (Elem) -> not lists:member(Elem, B) end, A ).
[1,5,6,7,8,9,10]

答案 1 :(得分:1)

简单的答案是 A = [1,2,3,3,4] B = [3,4]

          A -- B  = C
  
         [1,2,3,3,4] -- [3,4] = [1,2,3].

答案 2 :(得分:0)

它会产生无限循环。首先,你打电话

remove(1, [1,2,3,4]) ->
    [2,3,4] = lists:delete(1, [1,2,3,4]),
    remove(1, [2,3,4]).

所以你打电话

remove(1, [2,3,4]) ->
    [2,3,4] = lists:delete(1, [2,3,4]),
    remove(1, [2,3,4]).

然后再次使用相同的输入再次调用它。

解决此问题的一种方法是检查lists:delete/2是否返回相同的结果

remove(Elem, L)->
  case lists:delete(Elem,L) of
    L    -> L;
    Rest -> remove(Elem,Rest)
  end.

(功能条款remove(_,[])即使没有造成任何伤害也没有必要。)

但是有一种更为明确的方法:

remove(_, []) -> [];
remove(H, [H|T]) ->
    remove(H, T);
remove(X, [H|T]) ->
    [H | remove(X, T)].

可以使用列表推导来编写:

remove(X, L) ->
    [Y || Y <- L, Y =/= X].

结果代码基本相同。