我一直在使用java编程,而新编译为scala。我正在尝试一些基本的scala教程。我使用eclipse Juno 4.2和scala语言的插件。安装在机器上的JDK是1.7。
以下代码用于计算甚至斐波纳契系列的总和低于400万。 当我运行代码时,eclipse没有显示任何结果,我被迫终止进程
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)
另一方面,当我将变量a的默认值更改为2 时,
var (a,b) = (2,2)
系统编译并运行以给出这个答案1383447424
当变量a使用默认值1时,不知道为什么eclipse Juno不编译scala代码。机器上安装的JDK是JDK 1.7。
很高兴有解释
答案 0 :(得分: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)