这是一些命令性代码:
var sum = 0
val spacing = 6
var x = spacing
for(i <- 1 to 10) {
sum += x * x
x += spacing
}
这是我两次“功能化”以上代码的尝试:
// Attempt 1
(1 to 10).foldLeft((0, 6)) {
case((sum, x), _) => (sum + x * x, x + spacing)
}
// Attempt 2
Stream.iterate ((0, 6)) { case (sum, x) => (sum + x * x, x + spacing) }.take(11).last
我认为可能会有更清洁,更好的功能性方法。那会是什么?
PS:请注意,以上仅是示例代码,用于说明该问题。它不是来自真正的应用程序代码。
最佳答案
用N代替10,你有spacing * spacing * N * (N + 1) * (2 * N + 1) / 6
这是因为您要对范围1..N求和(间隔* i)^ 2。该和分解为间距^ 2 *(1 ^ 2 + 2 ^ 2 + ... + N ^ 2),众所周知,后一个和为N *(N + 1)*(2 * N + 1) )/ 6(请参阅Square Pyramidal Number)
关于scala - 提出更清洁的功能方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4912780/