我在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中要做作业,一个问题是关于计算列表的平均值。我在一两年前已经用另一种语言做到过,而且就像我第一次做那样,我决定不仅要...
为什么要这么复杂?为什么不只计算总和和计数?