【環境】
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();
}
}
}
No.2ベストアンサー
- 回答日時:
既に回答が付いていますが、2で割り切れる場合もifブロックの中での再起処理が終わった後にその下の処理が続けて行われるからですね。
下記の様にいくつか簡単な修正方法がありますが、修正後のソースから考えた方が分かりやすいかもしれません。
a. 2で割り切れる場合のifブロックの最後でメソッドを抜ける
例) ------------------------------------
if (counter %2 == 0)
{
System.out.println("2で割り切れちゃった----------->" + counter);
counter++;
playSaiki();
return; // この行を追加
}
----------------------------------------
b. ifで場合分けするのは、メッセージの表示部分だけにする
例) ------------------------------------
if (counter %2 == 0)
{
System.out.println("2で割り切れちゃった----------->" + counter);
}
else
{
System.out.println("2で割り切れなかった----------->" + counter);
}
counter++;
playSaiki();
----------------------------------------
回答ありがとうございます。
疑問に答えるだけでなく、改善策まで書いてくれるなんて...ほんとに感謝です。
修正するなら、2つ目のコードの方が無駄が少なくなくなりそうなので、それでやってみます。
No.3
- 回答日時:
ちょっと考えればわかるけど、
以下は playSaiki()の先頭に来たときのスタックトレースもどきです。
最初ぐんぐん潜っていって、戻り際にも3個出力するので、
0~7が出力されるのは明らかでしょう。
playSaikiは pSと略記してます。
pS() counter==0
pS() 割切->pS() counter==1
pS() 割切->pS() 割切ず->pS() counter==2
pS() 割切->pS() 割切ず->pS() 割切->pS() counter==3
pS() 割切->pS() 割切ず->pS() 割切->pS() 割切ず->pS()counter==4
pS() 割切->pS() 割切ず->pS() 割切->pS() 割切ず->pS() 割切->pS() counter==5
pS() 割切->pS() 割切ず->pS() 割切->pS() 割切ず->pS() 割切ず->pS() counter==6
pS() 割切->pS() 割切ず->pS() 割切ず->pS() couter==7
pS() 割切ず->pS() counter==8
スタックトレースもどき、ありがとうございます。
おかげで、視覚的にも問題を理解することができました。
今度またこのように再帰的にプログラミングする際は、自分でしっかり流れを追えるように、スタックトレースみたいなものを書いてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- その他(プログラミング・Web制作) Scratch プログラミングについての質問です 1 2022/06/14 19:42
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターに関する警告
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
ランダムで月を生成し、その月...
-
JAVAのDouble型の小数点以下の...
-
EclipseでJava
-
Javaのコマンドライン引数を使...
-
「続行するには何かキーを押し...
-
改行の判定方法
-
JavaにはなぜGO TO ...
-
nullcline
-
JAVA 文字色変更
-
文字列の引き算
-
JAVAのエラーの意味が分かりま...
-
会員情報登録プログラムの作成...
-
java シンボルが見つかりません...
-
Javaプログラムについて質問で...
-
java プログラミングについて
-
Javaでカレントディレクトリを...
-
printfの%fにおいて教本どおり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
C言語のポインターに関する警告
-
改行の判定方法
-
EclipseでJava
-
JAVAのDouble型の小数点以下の...
-
Javaでカレントディレクトリを...
-
文字列の引き算
-
JAVA 文字色変更
-
Javaのプログラムがどうしても...
-
エクセルマクロ文で、赤文字セ...
-
java シンボルが見つかりません...
-
java int integer
-
配列を後ろから数えるには?
-
java.util.zipで作成したアーカ...
-
JAVAのエラーの意味が分かりま...
-
会員情報登録プログラムの作成...
-
nullcline
-
コマンドプロンプトでひらがな...
-
NaNではなく、0と表示させたい
おすすめ情報