10/26 Java プログラミング入門(4)


質問と回答

Q.
// 実行結果は count=78で1になります
class Collatz{
  public static void main(String[] args){
    // (2)の部分は自分の学生証番号の下4桁を入れなさい。
    // 頭の0はつけないでください。
    int n= 263;
    int count=0;
    while(n!=1){
      System.out.println(n);
      if((n%2)==0){
        // nを2で割る
        n=n/2;
      }
      else{
        // nを3倍して1を足す
        n=3*n+1;
      }
        // 変数countを1増やす
      count=count+1;{   
        System.out.println("count="+count);
      }
    }
  }
}
で提出したのですが、
正解ですが、count=count+1のあとが{になって元のプログラムとは違った動作になっています。(荒川)
というコメントを頂きました。動作が違うとはどのようにことなっているのでしょうか?
A.
元のプログラムでは,出力は最後に,
count=78
とだけ出ますが,登録されたプログラムでは,
count=1
count=2
....
count=78
と,countを1つ増やすたびに,表示をするようになっています.
Q.
なぜそうなるのでしょうか?{ }が持つ意味もよくわからないのですが教えてください
A.
登録されたプログラムの,
   count=count+1;{
     System.out.println("count="+count);
   }
の部分ですが,「{」「}」は,繰り返しに 「繰り返しの文が複数ある時は,以下のように「{」,「}」でまとめて1つの文 にすることができる.」
  for(i=0;i<2;i++){
   System.out.print(" T ");
   System.out.prinln(".. T");
  }
とあるように,複数の文をまとめて一つの文にするための構文要素です.この場合は,中の文は,
System.out.println("count="+count);
だけなので,まとめても同じで,
  count=count+1;
  System.out.println("count="+count);
と同じ意味になります.これは,for文による繰り返し部分に入っているので,繰り返し実行されることになります.

元のプログラムでは,実行の最後に一度しか実行されないようになっていたはずです.

Q.
OutOfMemoryErrorというエラーが出て困ってます。 PCの環境によってこれは改善されるでしょうか?
A. プログラムを見ました.内部で, 10001 * 10001のサイズのint型の配列を使っていますが,これは少なくとも(どんな処理系でも)
10001 * 10001 * 4 = 400080004 = 381.5... MB
のメモリを必要とします(処理系によっては,ガーベジコレクションの関係でこの倍のサイズが必要に なる場合もあります).java起動時のオプションで使用可能なメモリ領域は増やせますが,このサイズの 配列を2つも確保できる実行環境は少なそうです.

このサイズの配列を使わないようにプログラムを変更しても構いませんが,1-1000の範囲に問題を変更して 解いても評価はします.


過去の課題について


前回までの補足


今日の内容


今日の課題