繁体   English   中英

Ocaml:递归:交集

[英]Ocaml: Recursion: 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]因为它一直与2中的第一个元素2进行比较,但是我希望l1也与tl2比较,有人对它有什么建议吗?

 Should I add another match [], [] -> to clarify base case at the beginning?

您如何引用其他列表中的第一个元素?

使用另一个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完全有用)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM