这是一些命令式代码:
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 求和 (spacing * i)^2。这个总和分解为 spacing^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/