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 在Utility Library中有许多可用的集合结构。

关于您的功能,您无法比较xmyFunc xs因为它们的类型可能不同。空列表是没有重复的列表(myFunc []应该返回false)。

这有效:

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

然而,最坏情况的时间复杂度是O(n 2 )n是列表的长度),这是非常低效的。

于 2012-04-05T18:46:35.023 回答