两个列表中有多少个元素相同(haskell)

时间:2016-03-22 12:51:57

标签: list haskell functional-programming

我尝试了解给定两组中有多少元素相同。要清楚,

let a = ["t","k","m"]
let b = ["k","b","t","c"]

" T"和" k"是两个列表的一部分,所以返回将是2.如何在不使用任何库和使用递归的情况下实现这个函数?

2 个答案:

答案 0 :(得分:1)

您可以使用模块m/[^0-9]+/将两个列表转换为集合并计算交集的大小:

Data.Set

Live demo

作为一般规则,如果列表中元素的顺序不重要且列表不包含重复项,那么将其转换为let a = Set.fromList ["t","k","m"] let b = Set.fromList ["k","b","t","c"] print $ Set.size (a `Set.intersection` b) 是一个好主意。

出于某种原因,您不想使用标准库。如果您不关心算法的复杂性,那么您可以使用:

Set

Live demo

如果你想把它放到递归形式,那么它是这样的:

length $ Prelude.filter (`elem` b) a

Live demo

如果您不想使用countDuplicates :: (Eq a) => [a] -> [a] -> Int countDuplicates [] b = 0 countDuplicates (x:rest) b = let index = if x `elem` b then 1 else 0 in index + countDuplicates rest b

将进一步扩展为:

elem

Live demo

答案 1 :(得分:0)

不使用任何额外功能,您可以按如下方式编写

countIntersect :: (Eq a) => [a] -> [a] -> Int
countIntersect _ [] = 0
countIntersect [] _ = 0
countIntersect (x:xs) y'@(y:ys) | x==y = 1 + countIntersect xs ys
                                | otherwise = countIntersect [x] ys + countIntersect xs y'

基本上,你手工做的方式,比较前两个元素,如果相同,增加计数器并移动两个列表中的下一个元素。如果不相等,则将第一列表的第一个元素与第二个列表的其余部分和第一个列表的剩余部分比较到第二个列表。