こんにちは、リストの一意の要素のみを含むリストを返す関数を作成しようとしています。[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([], 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]