1

我一直在用 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

不知道为什么eclipse Juno不编译scala代码,当变量a使用默认值1。机器上安装的JDK是JDK 1.7。

很高兴有解释

4

1 回答 1

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永远不会执行中的代码,所以它只是循环而不做任何事情。

如果您从 then 开始,a=2a%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)
于 2012-07-03T04:09:58.597 回答