Recursion OCaml中连续列表元素的平均计算
我试图用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'
[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]