2012-04-05 22 views
3

リストを検索し、このリストに重複した値があるかどうかを調べる単一の関数を記述したい。この関数はブール値を返さなければなりません。ここに私がいるところですが、これはうまくいきません...Duplicatesが存在するかどうかを調べるSML NJ

fun myFunc [] = true 
myFunc(x::xs) = 
if(x=myFunc(xs)) then false 
else myFunc(xs); 

[1,2,2,3,4,5,6] should return true 
[1,2,3,4,5,6,7] should return false 
[1,2,3,4,5,6,1] should return true 

ありがとう!

+0

あなたはSML/NJがセットをサポートしていることを認識していますか? – Marcin

+0

あなたはfoldまたはfindを使用することを意味しますか? – MCR

+0

いいえ、私はあなたのリストに重複が含まれているかどうかを検出するためにセットを使用できることを意味します。 – Marcin

答えて

7

@Marcinがコメントで述べたように、簡単で効率的な方法は、setを使って重複をチェックすることです。 SML/NJには、Utility Libraryで入手可能な多くの設定構造があります。

関数については、同じタイプでない可能性があるので、xmyFunc xsを比較することはできません。空リストは重複のないリストです(myFunc []falseを返します)。

この作品:

fun duplicated [] = false 
    | duplicated (x::xs) = (List.exists (fn y => x = y) xs) orelse (duplicated xs) 

をしかし、最悪の場合の時間計算量は非常に非効率的であるO(N )nは、リストの長さである)です。

+0

私は実際に問題を考え出しました。これはまさに私がやったことです。ありがとうございました! – MCR

+0

なぜ、セットベースのソリューションではないのですか? – Marcin

+0

時々、私は、 'if ... then true else ...'のような冗長条件文を書くことにペナルティ税があるべきだと思っています。 –

関連する問題