这是一些命令性代码:

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/

10-12 17:07