break と continue
見つかったのに、まだ回り続ける
1000 件のデータから目当ての 1 件を探すとき、3 件目で見つかっても、素直な for は残りの 997 件を最後まで見に行きます。逆に「この値だけは計算に混ぜたくない」と思っても、ループは分け隔てなく全部処理します。
ループを最後まで回し切る、という前提を崩す道具が break と continue です。役割は一言で分かれます。break はループから出る、continue はその 1 周だけ飛ばす、です。
break はループの外へ出る
Java
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break;
}
System.out.println(i);
}
System.out.println("終了");出力は 1 2 3 4 終了 です。i が 5 になった瞬間にループを抜けるので、println(i) には届かず、i++ も動きません。
ここで return と混同しないでください。break が終わらせるのはループだけで、メソッドはそのまま続きます。ループの外にまだ処理があるなら break、メソッドごと終わらせたいなら return です。もうひとつ、break が抜けるのは一番内側のループ 1 つだけです。二重ループの内側で break を書いても、外側は何事もなかったように次の周へ進みます。
continue はその 1 周を飛ばす
Java
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue;
}
System.out.println(i);
}出力は 1 2 4 5 です。3 のときだけ println が飛ばされ、ループ自体は 5 まで最後まで回り切ります。飛ばすだけで終わらない、というのが continue です。
continue が向かう先は for の更新式 i++ です。ここが while との大きな違いになります。while の中でカウンタを進めるより前に continue を書くと、その更新ごと飛ばされて値が変わりません。
Java
int i = 0;
while (i < 10) {
if (i == 3) {
continue; // i++ に届かないので、ここから進まなくなる
}
i++;
}while で continue を使うときは、更新を先に済ませてから飛ばしてください。
やってみよう
Solution.sumEvenUntil(int n) を完成させましょう。1 から n まで進めながら偶数だけを合計に足し、合計がある値を超えたところで打ち切ります。
飛ばす側と抜ける側を、どこに置くかを先に決めてから書き始めてください。飛ばす判定はループの先頭側、打ち切りの判定は足したあとです。順番が入れ替わると、超えたはずの周の値が合計に入らなかったり、逆に 1 周ぶん多く足されたりします。
n を大きくしても答えが増えなくなる境目がどこにあるか、10 20 100 を渡して確かめてみてください。
要件
- クラス名は
Solution、メソッド名はsumEvenUntil、引数はint n1 つにすること forループでi = 1からi <= nまで進め、奇数はcontinueでスキップすること- 偶数を合計に足し、合計が
50を 超えた (> 50) 時点でbreakでループを抜けること
入出力例
sumEvenUntil(10) → 30
sumEvenUntil(4) → 6
sumEvenUntil(20) → 56
sumEvenUntil(100) → 56
sumEvenUntil(2) → 2
sumEvenUntil(1) → 0
sumEvenUntil(0) → 0
sumEvenUntil(12) → 42
sumEvenUntil(14) → 56
sumEvenUntil(8) → 20