2017-10-08 86 views
-1

我想在Scala中編寫一個代碼來計算使用while循環從x到y的元素總和。 我初始化x和y爲例如:用一個while循環計算從x到y的整數總和

val x = 1 
val y = 10 

然後我寫了一個循環增加x:

while (x<y) x = x + 1 

不過的println(X)給出結果10所以我假設的代碼基本上做1 + 1 + ... + 1 10次,但那不是我想要的。

回答

3

一個辦法是找到通過一系列的總和,轉換成一個列表:

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

輸出:

sum = 55 

演示在這裏:

Rextester

+0

它的工作原理,但我想讓它與while循環一起工作。用戶@PARAMESWARA REDDY給出了正確的代碼。謝謝! – SidiAli

+2

@SidiAli while循環和可變變量不是慣用的scala。不要使用它們。只是假裝他們不存在。 – Dima

-3
var x = 1 
var y = 10  
var temp = 0 

while (x < y) { 
    temp = temp+x 
    x = x + 1 
} 

println(temp) 

這給需要的結果

+0

這產生了45的答案,而不是55.'while'循環條件應該是'x <= y',而不是'x

1

這裏是你將如何使用與var做吧while循環(犛牛!):

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)是初始總和值,和(_ + _)將當前總和爲當前值。 (這是斯卡拉簡寫爲((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 

雖然可以使用斯卡拉勢在必行代碼(使用var s,while等循環等,其中固有導致共享可變狀態),我強烈建議您考慮功能替代品。 功能編程避免了副作用共享可變狀態的複雜性,並經常會導致更簡單,更優雅的代碼。請注意,除第一個示例外,其他所有功能都是可用