您好我正在尝试编写一个函数,该函数返回一个列表,其中仅包含列表的唯一元素,例如。[1,2,3,1,1,2,3,4,5,5,1] -> [1,2,3,4,5]
唯一的问题是我不能使用除我正在编写的这个功能之外的任何其他功能(不允许)。
所以:
unique([H|T]) ->有什么想法吗?
(与递归有关)
非常不言自明,一个查找辅助函数,它执行唯一检查。
check_unique(List) ->
check_unique(List, []).
check_unique([H|T], Acc) ->
case find(H, Acc) of
true ->
check_unique(T, Acc);
false ->
check_unique(T, Acc ++ [H])
end;
check_unique([], Acc) ->
Acc.
find(E, [E|_]) ->
true;
find(E, [_|T]) ->
find(E, T);
find(_E, []) ->
false.
一个没有库功能的简短的:
unique(L) -> unique (L,[]).
unique([],R) -> R;
unique([H|Q],R) ->
case [Y || Y <- Q, Y =:= H] of
[] -> unique(Q,[H|R]);
_ -> unique(Q,R)
end.
我使用了 =:= 比较,所以 1 和 1.0 被认为是不同的。
不是最快的实现,但很简单。
unique(L) -> unique(L, []).
unique([], UL) -> UL;
unique([H|T], UL) ->
case lists:member(H,UL) of
true ->
unique(T, UL);
false ->
unique(T, [H|UL])
end.
该函数反向生成列表。你可以打电话lists:reverse()
。
1> test:unique([1,2,3,1,2,3]).
[3,2,1]
2> test:unique([1,2,3,1,1,2,3,4,5,5,1]).
[5,4,3,2,1]