递归计算列表平均值

问题描述 投票:0回答:1

我在OCaml中要做作业,一个问题是关于计算列表的平均值。我在一两年前已经用另一种语言做到了这一点,就像我第一次做那样,我决定不仅求和所有元素并除以长度。主要原因是担心浮点溢出。

所以我找到了我上次在Wikipedia上使用的公式:recursive average formula

我在OCaml中以这种方式编码:

let average = function
| []    -> raise Empty_list
| hd::l ->
    let rec aux average count = function
        | hd::l -> aux ((average*.(float (count-1))+.hd)/.(float (count))) (count+1) l
        | _     -> average
    in aux hd 1 l
;;

对我来说,这看起来像是OCaml中公式的确切转录。

但是它没有用,但是在拿了纸,笔和笔之后,我设法通过替换行使其开始起作用:

| hd::l -> aux ((average*.(float (count-1))+.hd)/.(float (count))) (count+1) l

with:

| hd :: l->辅助((平均值*。(浮点(count]])+。hd)/。(浮点(count + 1)))(count + 1)l

并且有效。

我告诉自己,从逻辑上讲,第二行是计算正确答案的好方法,但是我一开始无法理解什么地方出了问题。我是否翻译了有偏见的公式?还是我在翻译时错过了一些东西?

在这一点上,我仍然希望第一行是公式的抄写,而第二行是计算正确答案的方式。但是我相信这里有些我不明白的地方。有人可以帮我阐明一下吗?

提前,谢谢。

我在OCaml中要做作业,一个问题是关于计算列表的平均值。我在一两年前已经用另一种语言做到过,而且就像我第一次做那样,我决定不仅要...

recursion ocaml average tail-recursion caml
1个回答
0
投票

为什么要这么复杂?为什么不只计算总和和计数?

© www.soinside.com 2019 - 2024. All rights reserved.