或者递归地比较列表中的元素

时间:2017-02-10 18:07:30

标签: ocaml

我想比较一下: 我有一个列表l: [11,2,2,3]x = 11, y = 2, z = 2 and t = 3。 我想比较x to y, z, t然后比较y to z, t然后z to t. 如果它们是等于,则将它们放入列表中,否则继续比较列表的其余部分。 这是我到目前为止所做的,但它没有给我正确的答案。我期待的结果是列表:[y, z] => [2,2]你能帮我吗?谢谢。

let rec compare_element_list l =
    match l with
    | [] | [_] -> []
    | x :: y :: [] ->
      if x = y
      then
        (*add x and y into a list*)
        let result = x :: y :: [] in
        result
      else
        []
    | x :: y :: tl ->
      if x = y
      then
        let result = x :: y :: [] in
        result; compare_element_list tl
      else
        match tl with
        | [] -> []
        | [z] ->
          if x = z then
            let result = x :: z :: [] in result
          else []
        | z :: tl' ->
          if x = z
          then
            let result = x :: z :: [] in
            result; compare_element_list tl'
          else compare_element_list tl'

1 个答案:

答案 0 :(得分:2)

对于列表中的每个元素,您只需要检查它是否是列表其余部分的成员。您将获得以下功能:

let rec compare_element_list = function
  | [] | [_] -> []
  | x::tail ->
    let result = compare_element_list tail in
    if List.mem x tail
    then x::x::result
    else result

上面的这个函数不是尾递归的。这是尾递归版本:

let rec compare_element_list buf = function
  | [] | [_] -> buf
  | x::tail ->
    if List.mem x tail
    then compare_element_list (x::x::buf) tail
    else compare_element_list buf tail

(要应用tail-rec版本,您需要提供一个空缓冲区:  compare_element_list [] [11;2;2;3]