KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
This weekend I decided to try my hand at some Scala and Clojure. I'm proficient with object oriented programming, and so Scala was easy to pick up as a language, but wanted to try out functional programming. This is where it got hard. I just can't seem to get my head into a mode of writing functions. As an expert functional programmer, how do you approach a problem? Given a list of values and a defined period of summation, how would you generate a new list of the simple moving average of the list? For example: Given the list values (2.0, 4.0, 7.0, 6.0, 3.0, 8.0, 12.0, 9.0, 4.0, 1.0), and the period 4, the function should return: (0.0, 0.0, 0.0, 4.75, 5.0, 6.0, 7.25, 8.0, 8.25, 6.5) After spending a day mulling it over, the best I could come up with in Scala was this: 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 } I know this is horribly inefficient, I'd much rather do something like: 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) Now that would be easily done in a imperative style, but I can't for the life of me work out how to express that functionally.
Tags (comma-separated)
Save Edits
Cancel