【发布时间】:2013-11-12 13:03:59
【问题描述】:
您好,我正在尝试编写一个函数,该函数返回一个列表,其中仅包含列表的唯一元素,例如。 [1,2,3,1,1,2,3,4,5,5,1] -> [1,2,3,4,5]
唯一的问题是我不能使用除我正在编写的这个函数之外的任何其他函数(不允许)。
所以:
unique([H|T]) -> 有什么想法吗?
(与递归有关)
【问题讨论】:
您好,我正在尝试编写一个函数,该函数返回一个列表,其中仅包含列表的唯一元素,例如。 [1,2,3,1,1,2,3,4,5,5,1] -> [1,2,3,4,5]
唯一的问题是我不能使用除我正在编写的这个函数之外的任何其他函数(不允许)。
所以:
unique([H|T]) -> 有什么想法吗?
(与递归有关)
【问题讨论】:
没有库函数的短篇:
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 被认为是不同的。
【讨论】:
非常不言自明,一个查找辅助函数,用于进行唯一检查。
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([], 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]
【讨论】: