OCaml intesection功能逻辑错误

时间:2017-09-30 18:42:04

标签: list recursion ocaml

所以我试着编写一个函数来返回l1和l2共有的元素列表,但是每次都返回空,我无法找到它的逻辑错误。 `

let rec intersection (l1 : 'a list) (l2 : 'a list) : 'a list = 
  let rec aux l1 l2 acc = match l1 with 
    | [] -> []
    | h1::t1 -> begin match l2 with
      | [] -> []
      | h2::t2 -> if h1 = h2 then aux t1 t2 (h1::acc) else aux l1 t2 acc 
      end in
    aux l1 l2 []

2 个答案:

答案 0 :(得分:0)

在辅助功能中,当l1或l2为空时,你可能想要返回acc,而不是返回[]。这就是函数每次返回[]的原因。但正如Jeffrey的回答所说,如果两个列表中的元素顺序不同,这仍然无法正常工作。你可以事先对它们进行排序。

答案 1 :(得分:-1)

aux的所有递归调用都传递t2,即第二个列表的尾部。当它到达第二个列表的末尾时,它结束 - 在这种情况下没有递归调用。因此,aux只能通过其第二个列表一次。但是(假设对列表的顺序没有限制)你需要多次浏览第二个列表,一次是第一个列表的每个元素。

对于它的价值,我很想使用两个辅助函数来解决这个问题。