我實現了一個功能,它通過一個刪除列表中的一個元素:如何刪除列表中的元素?
remove(_,[])->
[];
remove(Elem, L)->
Rest = lists:delete(Elem,L),
remove(Elem,Rest).
,但它掛起當我試圖用這個例子:
L = [1,2,3,4].
remove(hd(L), [L]).
有什麼不妥的地方。還是有更好的方法從列表的第一個元素開始逐個刪除列表中的元素。
我實現了一個功能,它通過一個刪除列表中的一個元素:如何刪除列表中的元素?
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