【问题标题】:How to deal with duplicate elements in the list in Haskell [duplicate]如何处理Haskell列表中的重复元素[重复]
【发布时间】:2011-04-12 15:48:39
【问题描述】:

可能重复:
Searching through list

我需要编写一个函数“once”,给定一个整数列表和一个整数 n,它返回一个布尔值,指示 n 是否在列表中恰好出现一次。例如

Main>  once [2,3,2,4] 2
False
Main> once [1..100] 2
True

这是我当前的代码:

once :: Int -> [Int] -> Bool
once x [] = False
once x (y:ys) = (x==y) || (once x ys)

它只检查 x 是否是列表的一部分,但它不能告诉 x 在列表中出现了多次,因此返回 false。 需要帮助,谢谢!

【问题讨论】:

  • 我打赌两个学生上同一门课 :D
  • 我希望 van Deemter 教授不要因为你愚蠢和懒惰而决定设置另一个评估,不仅自己做评估,甚至改变问题......

标签: list haskell duplicates


【解决方案1】:

这样做的可能性有很多。如果你知道这个列表是有限的,你可以说:

once x xs = length (filter (==x) xs) == 1

(如果不是有限的,就没有解。)

顺便说一句,您的解决方案中几乎已经有了它,您只需替换

|| (once x ys)

&& (x `notElem` ys)

【讨论】:

  • 如果它是一个无限集呢,谢谢...
  • 如果是无限的可能需要一段时间:)
  • 这是stackoverflow.com/questions/5600706/searching-through-list 的完全重复,甚至是后续问题...
  • 对于无限列表,算法只有在找到第二个 x 时才能终止。因此,这样的函数在某些情况下只能返回 False,但当列表包含 no 或 1 x 时将永远运行。统计学家可能会争辩说,无限列表包含至少 2 倍相同值(来自有限域)的可能性很高。即使在这种情况下(一次 x (repeat (x+1))),由于硬件错误,计算机每隔十亿年也可能产生随机结果。如果你不介意等那么久 --- 你仍然只会得到 False 结果。
【解决方案2】:

试试这个:

  • 编写一个函数once,它扫描列表直到它第一次找到元素或列表末尾。在后一种情况下,它返回False,否则它在列表的其余部分调用once'并返回结果。
  • once'once 基本相同,但如果找到元素则返回 False,否则返回 True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多