※ ChatGPTを利用し、要約された質問です(原文:【Java】再帰的なプログラムで予期せぬ動作をする)
Javaプログラムで予期せぬ動作が発生する理由
このQ&Aのポイント
Javaの再帰的なプログラムで予期しない結果が生じています。カウンターの値が予想と異なる出力がされます。
ソースコードを見ても、なぜこのような動作が起こるのか理解できません。どうして予測と異なる結果になるのか教えてください。
質問者は期待している動作は次のようなものですが、実際には異なる結果が得られます。なぜこのような動作になるのでしょうか?
【Java】再帰的なプログラムで予期せぬ動作をする
【環境】
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)
----------------------------------------------------------------
以下のようなプログラムを書いたのですが、自分が予測していた動作と異なり、困っています。
私は
-------------Start-------------
カウント----------->0
2で割り切れちゃった----------->0
カウント----------->1
2で割り切れなかった----------->1
カウント----------->2
2で割り切れちゃった----------->2
カウント----------->3
2で割り切れなかった----------->3
カウント----------->4
2で割り切れちゃった----------->4
-------------End-------------
という動作を期待していたのですが、実際は
-------------Start-------------
カウント----------->0
2で割り切れちゃった----------->0
カウント----------->1
2で割り切れなかった----------->1
カウント----------->2
2で割り切れちゃった----------->2
カウント----------->3
2で割り切れなかった----------->3
カウント----------->4
2で割り切れちゃった----------->4
2で割り切れなかった----------->5
2で割り切れなかった----------->6
2で割り切れなかった----------->7
-------------End-------------
となってしまいました。考えても、どうしてこのように動作するのか理解できなかったので、こちらに質問しました。よろしくお願いします(ソースコードは下です)。
-----------------以下、ソースコード-----------------
Main.java
public class Main
{
public static void main(String args[])
{
Saiki saiki = new Saiki();
System.out.println("-------------Start-------------");
saiki.playSaiki();
System.out.println("-------------End---------------");
}
}
Saiki.java
public class Saiki
{
private int counter;
Saiki()
{
counter = 0;
}
public void playSaiki()
{
if(counter < 5)
{
System.out.println("カウント----------->" + counter);
if(counter%2 == 0)
{
System.out.println("2で割り切れちゃった----------->" + counter);
counter++;
playSaiki();
}
System.out.println("2で割り切れなかった----------->" + counter);
counter++;
playSaiki();
}
}
}
お礼
回答ありがとうございます。 疑問に答えるだけでなく、改善策まで書いてくれるなんて...ほんとに感謝です。 修正するなら、2つ目のコードの方が無駄が少なくなくなりそうなので、それでやってみます。