【问题标题】:OCaml intesection function logical errorOCaml 交集函数逻辑错误
【发布时间】:2018-03-12 08:51:32
【问题描述】:

所以我正在尝试编写一个函数来返回 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 []

【问题讨论】:

    标签: list recursion ocaml


    【解决方案1】:

    所有对aux 的递归调用都通过t2,第二个列表的尾部。当它到达第二个列表的末尾时,它就结束了——在这种情况下没有递归调用。所以,aux 只能通过它的第二个列表一次。但是(假设列表的顺序没有限制)您需要多次遍历第二个列表,第一个列表的每个元素一次。

    为了它的价值,我很想使用 两个 帮助函数来解决这个问题。

    【讨论】:

      【解决方案2】:

      在您的 aux 函数中,您可能希望在 l1 或 l2 为空时返回 acc,而不是返回 [ ]。这就是函数每次都返回 [ ] 的原因。但正如杰弗里的回答所说,如果两个列表中元素的顺序不同,这仍然无法正常工作。您也许可以事先对它们进行排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 1970-01-01
        • 2015-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多