如何删除列表中的元素?
问题描述:
我实现了一个功能,它通过一个删除列表中的一个元素:如何删除列表中的元素?
remove(_,[])->
[];
remove(Elem, L)->
Rest = lists:delete(Elem,L),
remove(Elem,Rest).
,但它挂起当我试图用这个例子:
L = [1,2,3,4].
remove(hd(L), [L]).
有什么不妥的地方。还是有更好的方法从列表的第一个元素开始逐个删除列表中的元素。
答
它使无限循环。首先,你叫
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(_,[])
是没有必要的,即使它不会做任何伤害。)
但是还有一个更strightforward方法:
remove(_, []) -> [];
remove(H, [H|T]) ->
remove(H, T);
remove(X, [H|T]) ->
[H | remove(X, T)].
这可以通过遍历这样写:
remove(X, L) ->
[Y || Y <- L, Y =/= X].
生成的代码基本相同。
答
您也可以使用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]
谢谢主席先生,但还是删除(HD([]),[])抛出一个异常 – erlang
@erlang你没说什么异常是。这很重要。 – Carcigenicate
异常错误:bar参数,因为hd([]) – erlang