我想计算两个列表中的一对相互元素的数量,而不使用Prelude和Data.List之外的任何函数。每场比赛只计算一次。
例如:
[A,B,A]和[C,A,C]返回1(仅1 A)。
[A,A,A]和[A,C,A]返回2(2A)。
[A,B,C]和[C,A,A]返回2(A和C)。
这是我的尝试,我希望尽可能短,但失败了。
length filter (`elem` list1) list2
我的代码计数将为[A,B,A]和[C,A,C]返回2,因为它会计算两个列表中的所有匹配项。
答案 0 :(得分:2)
只需递归排序和计算。
getMatch :: Ord a => [a] -> [a] -> Int
getMatch l r = getMatch' (sort l) (sort r)
getMatch' [] _ = 0
getMatch' _ [] = 0
getMatch' l@(a: as) r@(b: bs) | a < b = getMatch' as r
| a == b = getMatch' as bs + 1
| otherwise = getMatch' l bs
测试:
λ> getMatch "ABA" "CAC"
1
λ> getMatch "AAA" "ACA"
2
λ> getMatch "ABC" "CAA"
2
答案 1 :(得分:2)
这是一个解决方案:
import Data.List
countEm count [] l2 = count
countEm count (x : xs) l2 = if elem x l2
then countEm (count + 1) xs (delete x l2)
else countEm count xs l2
delete
函数来自Data.List
,只从列表中删除一个元素。
测试您的示例:
> countEm 0 "ABA" "CAC"
1
> countEm 0 "AAA" "ACA"
2
> countEm 0 "ABC" "CAA"
2
将elem
和delete
合并到具有这两项职责的函数中仍然可以提高效率。