Le calcul de la Moyenne mobile d'une Liste

Ce week-end j'ai décidé de m'essayer à quelques Scala et Clojure. Je suis compétent avec la programmation orientée objet, et Scala est facile à ramasser comme une langue, mais je voulais essayer de la programmation fonctionnelle. C'est là que c'est devenu dur.

J'ai juste ne peut pas sembler obtenir ma tête dans un mode d'écriture de fonctions. Comme un expert programmeur fonctionnel, comment abordez-vous un problème?

Donné une liste de valeurs et d'une période définie de la sommation, comment voulez-vous générer une nouvelle liste de la moyenne mobile simple de la liste?

Par exemple: compte tenu de la liste values (2.0, 4.0, 7.0, 6.0, 3.0, 8.0, 12.0, 9.0, 4.0, 1.0), et le period 4, la fonction doit retourner: (0.0, 0.0, 0.0, 4.75, 5.0, 6.0, 7.25, 8.0, 8.25, 6.5)

Après une journée de ressasser sur, le mieux que je pouvais venir avec dans le Scala est ceci:

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
}

Je sais que c'est horriblement inefficace, je préfère faire quelque chose comme:

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)

Maintenant, qui serait facile à faire dans un impératif de style, mais je ne peux pas pour la vie de moi de travailler sur la façon d'exprimer que fonctionnellement.

InformationsquelleAutor James P | 2009-08-23