Ocaml:递归:交集

时间:2017-03-07 18:10:24

标签: recursion ocaml

函数名称: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?

1 个答案:

答案 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非常有用)