我有一份OCaml的作业,其中一个问题是关于计算列表平均值的。我在1或2年前已经用另一种语言完成了这个问题,正如我第一次做时所决定的那样,我决定不仅仅将所有元素相加并除以长度。主要原因是担心浮点溢出。
因此,我在维基百科上找到了我上次使用过的公式:递归平均值公式。
我在OCaml中编写了如下代码:
因此,我在维基百科上找到了我上次使用过的公式:递归平均值公式。
我在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
替换为:
| hd::l -> aux ((average*.(float (count))+.hd)/.(float (count+1))) (count+1) l
使之工作了。
我告诉自己第二行代码逻辑上是计算正确答案的好方法,但我不明白一开始哪里出错了。我是否翻译了有偏见的公式?或者翻译时漏掉了些什么?
到目前为止,对我来说,第一行代码仍然是公式的转录,而第二行代码是计算正确答案的方式。但我相信这里有些事情我无法理解。请有人为我解惑吧。