我试图在Scala中编写代码,使用while循环计算从x到y的元素总和。 我将x和y初始化为例如:
val x = 1
val y = 10
然后我写一个while循环来增加x:
while (x<y) x = x + 1
但println(x)给出结果10,所以我假设代码基本上做了1 + 1 + ... + 1 10次,但那不是我想要的。
答案 0 :(得分:3)
一种选择是通过范围找到总和,转换为列表:
val x = 1
val y = 10
val sum = (x to y).toList.sum
println("sum = " + sum)
<强>输出:强>
sum = 55
在这里演示:
答案 1 :(得分:1)
以下是如何使用带有while
的(yak!)var
循环执行此操作的方法:
var x = 1 // Note that is a "var" not a "val"
val y = 10
var sum = 0 // Must be a "var"
while(x <= y) { // Note less than or equal to
sum += x
x += 1
}
println(s"Sum is $sum") // Sum = 55 (= 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10)
这是使用递归函数的另一种更实用的方法。请注意完全缺少var
类型。
val y = 10
@scala.annotation.tailrec // Signifies add must be tail recursive
def add(x: Int, sum: Int): Int = {
// If x exceeds y, then return the current sum value.
if(x > y) sum
// Otherwise, perform another iteration adding 1 to x and x to sum.
else add(x + 1, sum + x)
}
// Start things off and get the result (55).
val result = add(1, 0)
println(s"Sum is $result") // Sum is 55
这是一种可以与集合一起使用的常用功能方法。首先,(x to y)
成为1到10之间的Range
值。然后,我们使用foldLeft
高阶函数对成员求和:
val x = 1
val y = 10
val result = (x to y).foldLeft(0)(_ + _)
println(s"Sum is $result") // Sum is 55
(0)
是初始和值,(_ + _
)将当前总和添加到当前值。 (这是{em> Scala ((sum: Int, i: Int) => sum + i)
的简写)。
最后,这是@TimBiegeleisen上面发布的优雅功能版本的简化版本。但是,由于Range
已经实现了.sum
成员,因此无需先转换为List
:
val x = 1
val y = 10
val result = (x to y).sum
println(s"Sum is $result") // Sum is 55
(sum
可以被认为等同于上面的foldLeft
示例,并且通常以类似的方式实现。)
顺便说一句,如果您只想将值从1加到10,则以下代码非常简洁地执行此操作:
(1 to 10).sum
虽然您可以使用 Scala 来编写命令性代码(使用var
s,while
循环等,并且这些代码本身会导致共享可变状态),我强烈建议您考虑功能替代方案。 功能编程避免了共享可变状态的副作用和复杂性,并且通常会产生更简单,更优雅的代码。请注意,除了第一个示例之外的所有示例都是有效的。
答案 2 :(得分:-3)
var x = 1
var y = 10
var temp = 0
while (x < y) {
temp = temp+x
x = x + 1
}
println(temp)
这提供了所需的结果