2017-02-10 101 views
1

我想比较例如: 我有一个列表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' 
+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 

(申请尾REC版本,你需要提供一个空的缓冲区: compare_element_list [] [11;2;2;3]