本周末,我决定尝试一些Scala和Clojure.我精通面向对象的编程,因此Scala很容易学习语言,但想尝试函数式编程.这是它变得艰难的地方.
我似乎无法进入编写函数的模式.作为一名专业的功能程序员,您如何解决问题?
给定一个值列表和一个定义的求和周期,您将如何生成列表中简单移动平均值的新列表?
例如:给定列表values(2.0,4.0,7.0,6.0,3.0,8.0,12.0,9.0,4.0,1.0)和period4,函数应该返回:(0.0,0.0,0.0,4.75,5.0,6.0, 7.25,8.0,8.25,6.5)
在花了一天时间考虑它之后,我在Scala中想出的最好的是:
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
}
Run Code Online (Sandbox Code Playgroud)
我知道这是非常低效的,我宁愿做类似的事情:
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)
Run Code Online (Sandbox Code Playgroud)
现在,这将很容易以一种命令式的方式完成,但我不能为我的生活弄清楚如何在功能上表达.