使用while循环计算从x到y的整数之和

时间:2017-10-08 10:30:05

标签: scala sum

我试图在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次,但那不是我想要的。

3 个答案:

答案 0 :(得分:3)

一种选择是通过范围找到总和,转换为列表:

val x = 1
val y = 10
val sum = (x to y).toList.sum
println("sum = " + sum)

<强>输出:

sum = 55

在这里演示:

Rextester

答案 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)

这提供了所需的结果