2016-12-01 121 views
0

我實現了一個功能,它通過一個刪除列表中的一個元素:如何刪除列表中的元素?

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

,但它掛起當我試圖用這個例子:

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

有什麼不妥的地方。還是有更好的方法從列表的第一個元素開始逐個刪除列表中的元素。

回答

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(_,[])是沒有必要的,即使它不會做任何傷害。)

但是還有一個更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]. 

生成的代碼基本相同。

+0

謝謝主席先生,但還是刪除(HD([]),[])拋出一個異常 – erlang

+0

@erlang你沒說什麼異常是。這很重要。 – Carcigenicate

+0

異常錯誤:bar參數,因爲hd([]) – erlang

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]