У меня есть домашняя работа в OCaml, и один вопрос касается вычисления среднего по списку. Я делал это уже 1 или 2 года go на другом языке, и, как и в первый раз, я решил не только суммировать все элементы и делить на длину. Основная причина - страх переполнения с плавающей точкой.
Итак, я нашел формулу, которую использовал в последний раз в Википедии: рекурсивная формула среднего значения .
Я закодировал это так в 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 (<b>count</b>))+.hd)/.(float (<b>count+1</b>))) (count+1) l
и это сработало.
Я сказал себе, что вторая строка логически хороша для вычисления правильного ответа, но я не могу понять, что было не так с самого начала. Я перевел предвзятую формулу? Или я что-то упустил при переводе?
На данный момент мне все еще кажется, что первая строка - это транскрипция формулы, а вторая - способ вычисления правильного ответа. Но я верю, что есть кое-что, чего я не могу понять здесь. Может кто-нибудь пролить свет на это для меня?