scala - 建议一种更清洁的功能方式

标签 scala functional-programming idioms

这是一些命令式代码:

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/

相关文章:

algorithm - 有没有办法对分区的 spark 数据集并行运行操作?

c++ - 从派生类引用基类的更好习惯用法?

c++ - For-loop 或 std::any_of,我应该使用哪一个?

scala - 支撑或不支撑 : case statement block

scala - Play Framework 如何为分发编译 View

java - 使用大小为 N 的自定义字母表将基数 10 的数字转换为基数 (Scala)

scala - 如何从功能上合并列表中重叠的数字范围

Scala的函数作为参数的用法

java - 以函数式风格 Java 计算阶乘递归

C Variadic Macro 简化对 fprintf 的调用