В эти выходные я решил попробовать свои силы в 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)
Теперь это легко сделать в императивном стиле, но я не могу понять, как выразить это функционально.