2012-07-03 37 views
1

我一直在java中編程,而scala是新的。我正在嘗試一些基本的Scala教程。我使用eclipse Juno 4.2和Scala語言的插件。安裝在機器上的JDK是1.7。Scala代碼不會在eclipse中運行juno

下面的代碼是用於計算平均斐波那契數列的總和低於400萬。 當我運行的代碼,日食不會顯示出任何結果,我被迫終止進程

var (a,b) = (1,2) 
var sum = 0 
while(a < 4000000) 
{ 
if(a % 2 == 0)   
{ sum += a 
val swap = a 
a = b 
b= swap + b}        
} 
println(sum) 

,另一方面當我改變變量的默認值設置爲2即

var (a,b) = (2,2) 

系統編譯和運行給這個答案1383447424

不知道爲什麼日食朱諾不編譯Scala代碼,當變量使用安裝在機器上的1 JDK中的缺省值是JDK 1.7。

會很高興有解釋

回答

6

它編譯,它不是一個Eclipse的問題。

該代碼與a=1有無限循環。如果格式化你的代碼,你會發現它看起來像這樣:

var (a, b) = (1, 2) 
var sum = 0 
while (a < 4000000) { 
    if (a % 2 == 0) {  <-- This scopes over everything in the loop! 
    sum += a 
    val swap = a 
    a = b 
    b = swap + b 
    } 
} 
println(sum) 

所以在while塊的唯一事情是條件if(a%2==0)。由於a=1不是2的倍數,因此if中的代碼從不執行,因此它只是繞着循環而不做任何事情。

如果你以a=2開頭,那麼a%2==0是真的,所以該塊執行,你沒有得到無限循環。但它實際上並沒有像你想要的那樣給你連斐波那契數的總和。

問題是if語句應該只覆蓋sum += a行。

var (a, b) = (1, 2) 
var sum = 0 
while (a < 4000000) { 
    if (a % 2 == 0) 
    sum += a 
    val swap = a 
    a = b 
    b = swap + b 
} 
println(sum) 
+0

謝謝dhg我現在明白問題是。猜猜期待代碼執行奇蹟,而不是理解我要求編譯器做的事情。 –