При вычислении скользящего среднего списка



в эти выходные я решил попробовать свои силы в некоторых Scala и Clojure. Я хорошо разбираюсь в объектно-ориентированном программировании, и поэтому Scala было легко подобрать в качестве языка, но хотел попробовать функциональное программирование. Вот где это стало трудно.



Я просто не могу заставить свою голову работать в режиме написания функций. Как опытный функциональный программист, как вы подходите к проблеме?



учитывая список значений и определенный период суммирования, как бы вы создать новый список простой скользящей средней из списка?



например: учитывая список values (2.0, 4.0, 7.0, 6.0, 3.0, 8.0, 12.0, 9.0, 4.0, 1.0), а period 4, функция должна возвращать: (0.0, 0.0, 0.0, 4.75, 5.0, 6.0, 7.25, 8.0, 8.25, 6.5)



проведя день, обдумывая это, лучшее, что я мог придумать в Scala, было это:



def simpleMovingAverage(values: List[Double], period: Int): List[Double] = {
(for (i <- 1 to values.length)
yield
if (i < period) 0.00
else values.slice(i - period, i).reduceLeft(_ + _) / period).toList
}


Я знаю, что это ужасно неэффективно, я бы предпочел что-то вроде:



where n < period: ma(n) = 0
where n = period: ma(n) = sum(value(1) to value(n)) / period
where n > period: man(n) = ma(n -1) - (value(n-period) / period) + (value(n) / period)


теперь это было бы легко сделать в императивном стиле, но я не могу для жизни меня выработать, как выразить это функционально.

550   0  

Comments

    Ничего не найдено.