2017-03-08 80 views
0

交叉口[1; 2; 2; 3; 4; 4; 3] [2; 3] = [2; 2; 3; 3]ocaml的递归

没有与我的代码,因为它目前一些错误返回[2; 2],因为它不会与t2匹配,只有h2,有没有人有任何建议我应该考虑改变这个方向?

let rec intersection (l1: int list) (l2: int list) : int list = 
    begin match l1, l2 with 
    | h1::t1, h2::t2 -> if h1=h2 then h1::intersection t1 l2 
           else intersection t1 l2 
    | _ -> [] 
    end 

回答

0

请注意,您的递归调用都通过l2,整个第二个列表。这意味着h2总是要引用相同的元素,即第二个列表的第一个元素。这就解释了为什么你只在2的例子中获得匹配。

您需要深入研究第二个列表。

作为一个方面的评论,这个函数不容易表示为一个单一的递归函数恕我直言。想想有两个单独的子操作可能会更好。尤其是,您对是否出现int值是否在l2感兴趣,这是它自己的单独问题。

+0

谢谢你的有用评论! (正式注明) – user