1

私は Java でプログラミングしており、scala は初めてです。いくつかの基本的なscalaチュートリアルを試していました.scala言語のプラグインでeclipse Juno 4.2を使用しています。マシンにインストールされている JDK は 1.7 です。

以下のコードは、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)

一方、変数 a のデフォルト値を 2 に変更すると、

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

システムがコンパイルおよび実行され、この回答が得られます 1383447424

変数 a がデフォルト値の 1 を使用している場合、Eclipse Juno が scala コードをコンパイルしない理由がわかりません。マシンにインストールされている 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実行されず、何もせずにループを回るだけです。

a=2thenで開始するa%2==0と true になるため、ブロックが実行され、無限ループは発生しません。しかし、それは実際にはあなたが望むようなフィボナッチ数の合計さえも与えていません.

問題は、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 に答える