Erlang:使用递归从列表中选择唯一项

Ale*_*ann 6 erlang recursion

给出Erlang中的任何列表,例如:

L = [foo, bar, foo, buzz, foo].
Run Code Online (Sandbox Code Playgroud)

如何使用递归函数仅显示该列表的唯一项?我不想使用内置函数,就像列表函数之一(如果存在).

在我的例子中,我想要的地方将是一个新列表,例如

SL = [bar, buzz].
Run Code Online (Sandbox Code Playgroud)

我的猜测是,在应用过滤器之前,我首先使用快速排序功能对列表进行排序?

任何的意见都将会有帮助.这个例子是Cesarini's&Thompson出色的"Erlang编程"一书中第3章练习的变体.

Pas*_*cal 7

我提出这个:

unique(L) ->
    unique([],L).
unique(R,[]) -> R; 
unique(R,[H|T]) ->
    case member_remove(H,T,[],true) of
        {false,Nt} -> unique(R,Nt);
        {true,Nt} -> unique([H|R],Nt)
    end.

member_remove(_,[],Res,Bool) -> {Bool,Res};
member_remove(H,[H|T],Res,_) -> member_remove(H,T,Res,false);
member_remove(H,[V|T],Res,Bool) -> member_remove(H,T,[V|Res],Bool).
Run Code Online (Sandbox Code Playgroud)

member_remove函数在一次传递中返回剩余的尾部,而不会检查所有出现的元素是否重复以及测试结果.