Recursion OCaml中连续列表元素的平均计算

Recursion OCaml中连续列表元素的平均计算,recursion,ocaml,average,Recursion,Ocaml,Average,我试图用OCaml编写一个函数,用于计算列表中连续元素的平均值。例如,使用[1;2;3;4]时,它应该输出[1;2;3]。它应该取(1+2)/2并给出1,然后取(2+3)/2并给出2,依此类推。 但是,我编写的代码只返回[1;2]: let rec average2 xs = match xs with |[] -> [] |x :: [] -> [x] |x :: x' :: xs -> if xs = [] then [(x + x') / 2] else [(x + x'

我试图用OCaml编写一个函数,用于计算列表中连续元素的平均值。例如,使用
[1;2;3;4]
时,它应该输出
[1;2;3]
。它应该取
(1+2)/2
并给出
1
,然后取
(2+3)/2
并给出
2
,依此类推。 但是,我编写的代码只返回
[1;2]

let rec average2 xs = match xs with
|[] -> []
|x :: [] -> [x]
|x :: x' :: xs -> if xs = [] then [(x + x') / 2] else [(x + x') / 2] @ (average2 xs)

你能告诉我怎么修理这个吗。谢谢。

当你在比赛中进行
x::y::l
时,你实际上是在永久删除列表中的元素。 因此,如果您想对元素对执行操作,则需要将一个元素放回

例如:

您有一个
[1;2;3;4]

如果要在1和2上操作,则在匹配中,它将解释为:

1 :: 2 :: [3;4]
如果继续而不在中添加元素,则下一条语句将是:

3 :: 4 :: []
这不是你想要的


要纠正这一点,在递归调用中,您需要执行
(average2(x'::xs)
,而不仅仅是
(average2 xs)
,因为
xs
是取出元素后列表的其余部分。

在匹配中执行
x::y::l
时,实际上是永久取出列表中的元素。 因此,如果您想对元素对执行操作,则需要将一个元素放回

例如:

您有一个
[1;2;3;4]

如果要在1和2上操作,则在匹配中,它将解释为:

1 :: 2 :: [3;4]
如果继续而不在中添加元素,则下一条语句将是:

3 :: 4 :: []
这不是你想要的


要纠正这一点,在递归调用中,您需要执行
(average2(x'::xs)
,而不仅仅是
(average2 xs)
,因为
xs
是取出元素后列表的其余部分。

OCaml允许使用
p
将模式
p
绑定到变量
v

上面,
y::uu-as-tail
将名为
tail
的列表分解为一个非空列表,以
y
为首,并具有任意尾部
\uu
,其值我们不关心。 请注意,我还简化了您的函数,这样您就不会检查
\uu
是否为空:递归在这里为您处理这个问题。 此外,当列表中有零个或一个元素时,应该返回一个空列表

# average2 [ 10; 20; 30; 40];;
- : int list = [15; 25; 35]

OCaml允许使用
p as v
()将模式
p
绑定到变量
v

上面,
y::uu-as-tail
将名为
tail
的列表分解为一个非空列表,以
y
为首,并具有任意尾部
\uu
,其值我们不关心。 请注意,我还简化了您的函数,这样您就不会检查
\uu
是否为空:递归在这里为您处理这个问题。 此外,当列表中有零个或一个元素时,应该返回一个空列表

# average2 [ 10; 20; 30; 40];;
- : int list = [15; 25; 35]