确定Haskell中是否有重复项的显式递归

时间:2015-05-07 02:33:56

标签: haskell recursion list-comprehension

这是教程分配的一小部分,我们被要求首先使用列表推导定义函数,然后使用显式递归。

  
      
  1. 使用列表推导,定义一个函数
  2.         

    重复:: Eq a => a - > [a] - >布尔

         

    获取列表元素和列表,如果列表中有多个列表元素副本,则返回True。例如:

         

    重复10 [1,2,11,11] =错误

         

    重复10 [1,2,10,11] =错误

         

    重复10 [1,2,10,10] =真

为此,我有以下代码:

duplicated::Eq a => a -> [a] -> Bool
duplicated n xs = length[x | x <- xs, x == n] > 1

但无论我怎么解决这个问题,我都无法通过显式递归找到一种方法。

1 个答案:

答案 0 :(得分:5)

这是使用显式递归的方法:

duplicated :: Eq a => a -> [a] -> Bool
duplicated _ []     = False
duplicated n (x:xs) = callback n xs
    where callback  = if x == n then elem else duplicated

以下是它的工作原理:

  1. 如果列表为空,则表示我们在列表中找不到一个元素n。因此,我们返回False
  2. 否则,如果列表的当前元素为n,则表示我们找到了一个元素n。因此,我们返回elem n xs来检查n是否也在xs
  3. 否则,我们递归调用duplicated n xs
  4. 希望有所帮助。