5

リストを検索し、このリストに重複する値があるかどうかを検出する単一の関数を作成したいと思います。関数はブール値を返す必要があります。これが私がいるところですが、これは機能していません...

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

ありがとう!

4

1 に答える 1

10

@Marcinがコメントで述べたように、簡単で効率的な方法は、重複をチェックするためにsetを使用することです。SML / NJには、ユーティリティライブラリで利用できる多くのセット構造があります。

機能に関しては、同じタイプではない可能性があるため、x比較することはできません。myFunc xsそして、空のリストは重複のないリストです(myFunc []戻る必要がありfalseます)。

これは機能します:

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

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

于 2012-04-05T18:46:35.023 に答える