繰り返しの回数を数える
「この行は何回実行されますか」という問題は、第3問で毎年のように出ます。 考え方は単純ですが、1回ずれる間違いが非常に多いところです。 ずれを防ぐ数え方の型を、例題で身につけます。
BASIC
「〜から〜まで」は両端を含む
共通テスト用プログラム表記の i を a から b まで 1 ずつ増やしながら繰り返す は、
a も b も含めて繰り返します。したがって回数は次の式で求まります。
繰り返す回数 = b − a + 1
この 「+ 1」を忘れるのが、最も多い間違いです。 不安なときは、迷わず i の値を書き出してください。「0, 1, 2, 3」と書けば、4個だと目で分かります。
| 書き方 | i がとる値 | 回数 |
|---|---|---|
| 0 から 3 まで | 0, 1, 2, 3 | 4回 |
| 1 から 4 まで | 1, 2, 3, 4 | 4回 |
| 2 から 6 まで | 2, 3, 4, 5, 6 | 5回 |
| 0 から 要素数 - 1 まで | 0 〜 要素数-1 | 要素数と同じ |
「〜の間繰り返す」は条件で止まる
もうひとつの形が 条件 の間繰り返す です。こちらは回数が最初から決まっておらず、
条件が成り立たなくなった時点で止まります。
回数を知るには、変数の値を1周ごとに書き出すしかありません。
重要なのは判定のタイミングです。この形は繰り返しの前に条件を調べるため、 最初から条件が成り立たなければ1回も実行されません。
EXERCISE 1
例題1:回数を数える
次のプログラムで、total = total + i は何回実行されますか。
total = 0 i を 2 から 6 まで 1 ずつ増やしながら繰り返す: ⎿ total = total + i 表示する(total)
選択肢:① 3回 ② 4回 ③ 5回 ④ 6回
答えと解説を見る
答え:③ 5回
i がとる値を書き出すと 2, 3, 4, 5, 6 の5個です。 式で求めるなら 6 − 2 + 1 = 5 となります。
| i | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|
| total | 2 | 5 | 9 | 14 | 20 |
② の4回は 6 − 2 = 4 と計算して「+1」を忘れた場合です。 この引き算だけで答えると必ず1回少なくなります。
なお、この問題では合計は20になります。「何回実行されるか」と「合計はいくつか」は 別々に問われるので、問われているのがどちらかを必ず確認してください。
EXERCISE 2
例題2:条件で止まる繰り返し
次のプログラムで、count = count + 1 は何回実行されますか。(÷ は小数を切り捨てます)
x = 48 count = 0 x > 5 の間繰り返す: |x = x ÷ 2 ⎿ count = count + 1 表示する(x, count)
選択肢:① 3回 ② 4回 ③ 5回 ④ 6回
答えと解説を見る
答え:② 4回
回数が決まっていないので、1周ごとに表を作るのが確実です。 条件は繰り返しの前に判定される点に注意します。
| 判定 | x > 5 ? | 実行後の x | count |
|---|---|---|---|
| 1回目 | 48 > 5 ○ | 24 | 1 |
| 2回目 | 24 > 5 ○ | 12 | 2 |
| 3回目 | 12 > 5 ○ | 6 | 3 |
| 4回目 | 6 > 5 ○ | 3 | 4 |
| 5回目 | 3 > 5 × | 条件が成り立たないので終了 | |
x は 48 → 24 → 12 → 6 → 3 と変化し、3 になった時点で x > 5 が成り立たなくなります。
最後の判定(5回目)では中身が実行されないため、count は4のままです。
③ の5回は、この最後の判定も1回に数えてしまった場合です。 「判定した回数」と「中身が実行された回数」は1つ違うことを押さえてください。 問題文が「何回判定されますか」と聞いていれば5回が正解になります。
EXERCISE 3
例題3:途中で抜ける場合
次のプログラムにおいて、もし Nums[i] == 4 ならば の行は何回判定されますか。
Nums = [1, 3, 4, 6] i を 0 から 要素数(Nums) - 1 まで 1 ずつ増やしながら繰り返す: |もし Nums[i] == 4 ならば: ⎿⎿ 繰り返しを抜ける
選択肢:① 1回 ② 2回 ③ 3回 ④ 4回
答えと解説を見る
答え:③ 3回
範囲だけを見ると「0 から 3 まで」で4回に見えますが、
繰り返しを抜ける があるため途中で終わります。
| i | Nums[i] | == 4 ? | 動作 |
|---|---|---|---|
| 0 | 1 | × | 次へ |
| 1 | 3 | × | 次へ |
| 2 | 4 | ○ | 抜ける |
| 3 | 一度も調べられない | ||
判定が行われるのは i = 0、1、2 の3回です。 ④ の4回は、抜ける処理を見落として最後まで回ると考えた場合です。
「繰り返しを抜ける」を見たら、範囲の計算はいったん忘れてください。 回数はデータ次第で変わります。この形は 線形探索でそのまま使われるので、 シミュレーターで動きを見ておくと理解が早まります。
NESTED
二重ループは掛け算になる
繰り返しの中に繰り返しがある場合、実行回数は外側の回数 × 内側の回数です。
i を 1 から 3 まで 1 ずつ増やしながら繰り返す: |j を 1 から 2 まで 1 ずつ増やしながら繰り返す: ⎿⎿ 表示する(i, j)
外側が3回、そのそれぞれで内側が2回動くので、3 × 2 = 6回です。 実際に表示される組み合わせを並べると、次のようになります。
(1,1) (1,2) → i=1 のとき (2,1) (2,2) → i=2 のとき (3,1) (3,2) → i=3 のとき
内側が先に最後まで回り、それから外側が1つ進む——この順番が二重ループの基本です。
内側の範囲が外側の値によって変わる場合(j を i から … など)は掛け算では求まらないので、
1行ずつ書き出す必要があります。詳しくは
二重ループと2次元配列で扱います。
EXERCISE 4
例題4:回数から終わりの値を逆算する
「Hello」をちょうど5回表示するには、[ ア ]に何を入れればよいですか。
i を 0 から [ ア ] まで 1 ずつ増やしながら繰り返す:
⎿ 表示する("Hello")
選択肢:① 4 ② 5 ③ 6 ④ 10
答えと解説を見る
答え:① 4
例題1は「この繰り返しは何回まわるか」を数える問題でした。 今回は逆に、決まった回数にするための終わりの値を決める問題です。 出題としては例題1よりよく見かける形です。
i は 0 から 始まります。0 を1回目と数えるので、 5回まわしたいなら最後の i は 4 です。
| 何回目 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| i の値 | 0 | 1 | 2 | 3 | 4 |
- ② 5 … 0〜5 の6回になります。「5回だから5」と考えた誤りで、選ぶ人がいちばん多い選択肢です
- ③ 6 … 0〜6 の7回です
- ④ 10 … 0〜10 の11回です
0 から 要素数 - 1 まで が
「要素数の回数だけまわる」のも、まったく同じ理由です。
配列と添字で覚えた形とつながっていることを確認しておいてください。
EXERCISE 5
例題5:隣どうしを比べるときの範囲
Data[i] と Data[i + 1] を安全に比べるには、[ ア ]に何を入れればよいですか。
Data = [3, 5, 4, 6, 8] pos = -1 i を [ ア ] まで 1 ずつ増やしながら繰り返す: |もし Data[i] > Data[i + 1] ならば: ||pos = i ⎿⎿ 繰り返しを抜ける 表示する(pos)
選択肢:① 0 から 要素数(Data) - 1 ② 0 から 要素数(Data) - 2 ③ 1 から 要素数(Data) - 1 ④ 0 から 要素数(Data)
答えと解説を見る
答え:② 0 から 要素数(Data) - 2
繰り返しの範囲はいつも「0 から 要素数 - 1 まで」とはかぎりません。 決め方は1つだけで、「繰り返しの中で使っている、いちばん大きい添字は何か」を見ます。
このプログラムが使っているのは Data[i] と Data[i + 1] です。
要素数は5なので、存在する添字は 0〜4。
i + 1 が 4 を超えてはいけないので、i の最大は 3、
つまり 要素数 - 2 までとなります。
| i | Data[i] | Data[i+1] | 大きい? |
|---|---|---|---|
| 0 | 3 | 5 | × |
| 1 | 5 | 4 | ○ → pos = 1 で抜ける |
| 2 | 4 | 6 | (実行されない) |
| 3 | 6 | 8 | (実行されない) |
表示されるのは 1 です。他の選択肢は次のようになります。
-
①(- 1 まで) … i が 4 のとき
Data[5]を見ようとします。 5番の箱は存在しないのでエラーです。ここが最大のひっかけです - ③(1 から) … 先頭どうしの比較(3 と 5)を飛ばしてしまいます
- ④(要素数 まで) … ①よりさらに1つ多く、確実にエラーになります
CODE
3つの表記での書き方の違い
i を 0 から 3 まで 1 ずつ増やしながら繰り返す: ⎿ 表示する(i) x = 48 x > 5 の間繰り返す: ⎿ x = x ÷ 2
for i in range(4):
print(i)
x = 48
while x > 5:
x = x // 2
for (let i = 0; i <= 3; i++) {
console.log(i);
}
let x = 48;
while (x > 5) {
x = Math.floor(x / 2);
}
range(3) は
0, 1, 2 の3回です。同じ「3」でも意味が違います。
Python では range(4) と書いて初めて4回になります。
JavaScript は i <= 3 なら4回、i < 3 なら3回です。
問題がどの表記で書かれているかを最初に確認してください。
CHECK
このテーマのチェックリスト
- 「a から b まで」の回数が b − a + 1 だと即答できる
- 「0 から 要素数 - 1 まで」の回数が要素数と同じだと分かる
- 「〜の間繰り返す」で、最後の判定では中身が実行されないと分かる
- 「判定した回数」と「実行された回数」を区別して答えられる
- 「繰り返しを抜ける」があればデータ次第で回数が変わると分かる
- 二重ループの回数が掛け算で求まると分かる
- n 回まわしたいときの終わりの値が n - 1 だと逆算できる
Data[i + 1]を使うなら範囲は1つ手前までだと分かる
数え方が身についたら、次は二重ループと2次元配列へ。 実際の問題で練習するなら、クイズの「実行回数」パターンが対応しています。