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