我想比较一下:
我有一个列表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
(要应用tail-rec版本,您需要提供一个空缓冲区:
compare_element_list [] [11;2;2;3]
)