Calculando a média móvel de uma lista

Este fim de semana eu decidi tentar minha mão em alguns Scala e Clojure. Sou proficiente em programação orientada a objetos e, assim, o Scala foi fácil de aprender como uma linguagem, mas queria testar a programação funcional. É aqui que ficou difícil.

Eu simplesmente não consigo colocar minha cabeça em um modo de escrever funções. Como um programador funcional especializado, como você aborda um problema?

Dada uma lista de valores e um período definido de soma, como você geraria uma nova lista da média móvel simples da lista?

Por exemplo: dada a listavalues (2.0, 4.0, 7.0, 6.0, 3.0, 8.0, 12.0, 9.0, 4.0, 1.0) eaperiod 4, a função deve retornar: (0.0, 0.0, 0.0, 4.75, 5.0, 6.0, 7.25, 8.0, 8.25, 6.5)

Depois de passar um dia pensando bem, o melhor que consegui fazer no Scala foi o seguinte:

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
}

Eu sei que isso é terrivelmente ineficiente, eu prefiro fazer algo como:

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)

Agora isso seria feito facilmente em um estilo imperativo, mas não posso, para minha vida, descobrir como expressá-lo funcionalmente.

questionAnswers(18)

yourAnswerToTheQuestion