【问题标题】:Find if Duplicates Exist SML NJ查找是否存在重复 SML NJ
【发布时间】:2012-04-19 11:05:49
【问题描述】:

我想编写一个函数来搜索列表并查找此列表中是否有任何重复值。该函数应返回一个布尔值。这是我所在的位置,但这不起作用...

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

谢谢!

【问题讨论】:

  • 您知道 SML/NJ 支持集合吗?
  • 不是,我的意思是你可以用set来检测你的list是否包含重复项。

标签: functional-programming sml smlnj


【解决方案1】:

正如@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(n2)n 是列表的长度),效率非常低。

【讨论】:

  • 我实际上只是想出了问题,这正是我所做的。谢谢!
  • 出于兴趣,为什么不采用基于集合的解决方案?
  • 有时我在想应该对编写像if ... then true else ...这样的冗余条件征收罚款 :)
  • @AndreasRossberg:我希望惩罚与再编辑一样小:)。
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2014-07-15
相关资源
最近更新 更多