Cálculo de la media móvil de una lista

Este fin de semana decidí probar suerte con Scala y Clojure. Soy experto en programación orientada a objetos, por lo que Scala fue fácil de entender como un lenguaje, pero quería probar la programación funcional. Aquí es donde se puso difícil.

Parece que no puedo poner mi cabeza en un modo de escribir funciones. Como experto programador funcional, ¿cómo aborda un problema?

Dada una lista de valores y un período de resumen definido, ¿cómo generaría una nueva lista del promedio móvil simple de la lista?

Por ejemplo: dada la listavalues (2.0, 4.0, 7.0, 6.0, 3.0, 8.0, 12.0, 9.0, 4.0, 1.0), y elperiod 4, la función debe devolver: (0.0, 0.0, 0.0, 4.75, 5.0, 6.0, 7.25, 8.0, 8.25, 6.5)

Después de pasar un día reflexionando, lo mejor que pude encontrar en Scala fue esto:

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
}

Sé que esto es terriblemente ineficiente, preferiría hacer 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)

Ahora eso se haría fácilmente en un estilo imperativo, pero no puedo por mi vida descubrir cómo expresar eso funcionalmente.

Respuestas a la pregunta(18)

Su respuesta a la pregunta