函数名称:intersection:获取2个列表并返回两者中出现的所有元素的列表
即:[1; 2; 2; 3; 4; 4; 3] [2; 3] - > [2; 2; 3; 3]
let rec intersection (l1: int list) (l2: int list) : int list =
begin match l1, l2 with
| hd :: tl, hd2 :: tl2 -> if hd = hd2 then hd :: intersection tl l2
else intersection tl l2
| _ -> []
end
此代码存在问题,但我不确定如何修复它 - 代码将贯穿并获取[2; 2]因为它与l2中的第一个元素保持比较,但我希望l1也与tl2进行比较,是否有人有任何建议?
Should I add another match [], [] -> to clarify base case at the beginning?
答案 0 :(得分:0)
如何引用另一个列表中的第一个元素?
使用另一个match
声明:
let rec intersection (l1: int list) (l2: int list) : int list =
begin match l2 with
| [] -> []
| hd2 :: tl2 -> begin match l1 with
| [] -> …
| hd1 :: tl1 -> …
end
end
您还可以通过省略在这种情况下不必要的begin
/ end
括号,并立即匹配元组来简化此操作:
let rec intersection (l1: int list) (l2: int list) : int list = match l1, l2 with
| [], _ -> []
| hd1::tl1, [] -> …
| hd1::tl1, hd2::tl2 -> …
(免责声明:我忽略了一个问题,即查看同一函数中的两个第一个元素是否对实现intersection
非常有用)