我想要对两个已排序的列表进行交集操作,使得 intersect ([1;1;1;2;2], [1;1;2;4])
返回 [1;1;2]
。到目前为止,我做出了如下尝试:
let rec intersect (xs, xs') =
match xs, xs' with
| ([], []) -> []
| (x::tail, []) -> []
| ([], x'::tail') -> []
| (x::tail, x'::tail') -> if x = x' then x::intersect(tail, tail')
else intersect(tail, xs')
但我不太确定接下来该怎么做。这个函数接受一个包含两个列表的元组,我假设当每个列表的头相等时,开始构建一个新列表,但是我缺少一些我无法完全理解的东西,并希望得到一些提示。
编辑:我知道我可以使用库函数轻松解决这个问题,但那没什么乐趣 :)
x<x'
怎么办?使用else
处理。最后,在模式匹配中不要重复使用名称xs
,因为某些情况下需要原始的xs
。xs'
同理。 - TheQuickBrownFoxif
是一个表达式,而不是语句。最后一个分支应该只写else
,而不是else if
。你在第三次编辑中更接近正确了。 - TheQuickBrownFox