Berechnung des gleitenden Durchschnitts einer Liste

Dieses Wochenende habe ich beschlossen, mich an Scala und Clojure zu versuchen. Ich beherrsche die objektorientierte Programmierung, und so war Scala leicht als Sprache zu verstehen, wollte aber die funktionale Programmierung ausprobieren. Hier wurde es schwer.

Ich kann einfach nicht scheinen, meinen Kopf in eine Art von Schreibfunktionen zu bringen. Wie gehen Sie als erfahrener Funktionsprogrammierer mit einem Problem um?

Wie würden Sie bei einer vorgegebenen Werteliste und einem definierten Summationszeitraum eine neue Liste des einfachen gleitenden Durchschnitts der Liste erstellen?

Zum Beispiel: Angesichts der Listevalues (2,0, 4,0, 7,0, 6,0, 3,0, 8,0, 12,0, 9,0, 4,0, 1,0) undperiod 4 sollte die Funktion zurückgeben: (0,0, 0,0, 0,0, 4,75, 5,0, 6,0, 7,25, 8,0, 8,25, 6,5)

Nachdem ich einen Tag lang darüber nachgedacht hatte, war das Beste, was ich mir in Scala einfallen lassen konnte:

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
}

Ich weiß, dass dies schrecklich ineffizient ist. Ich würde lieber etwas tun wie:

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)

Nun, das wäre leicht in einem imperativen Stil zu tun, aber ich kann nicht für mein ganzes Leben herausfinden, wie ich das funktional ausdrücken kann.

Antworten auf die Frage(18)

Ihre Antwort auf die Frage