最大値の位置|擬似言語のトレース解説と練習問題
関数 maxIndex は、配列 data の中で最も大きい要素の要素番号を返す。配列の要素番号は 1 から始まる。
プログラム
| 1 | ○整数型: maxIndex(整数型の配列: data) |
| 2 | 整数型: pos ← 1 |
| 3 | 整数型: i |
| 4 | for (i を 2 から dataの要素数 まで 1 ずつ増やす) |
| 5 | if (data[i] > data[pos]) |
| 6 | pos ← i |
| 7 | endif |
| 8 | endfor |
| 9 | return pos |
何をしているか
「これまでに見た中で最大の要素の位置」を pos に覚えておき、それより大きい要素が見つかるたびに pos を書き換えます。覚えているのは値ではなく位置です。
トレースのコツ
- 比べているのは
data[i]とdata[pos]です。posそのものと比べているわけではありません。表にdata[pos]の列を作ると確かめやすくなります。 posが変わるのは条件が真の回だけです。何回変わるかは、配列の並びで決まります。- 繰返しは 2 から始まります。1番目の要素は、最初から「今のところ最大」として扱われています。
よくある間違い
- 戻り値を最大の値で答える。返すのは要素番号です。
posの書換え回数を「要素数 − 1」と答える。それは比較の回数で、書換えは条件が真の回だけです。- 配列の要素番号が 1 から始まることを忘れ、0 から数えてしまう。問題文の断り書きを必ず確かめます。
例題:maxIndex({5, 18, 28, 20, 21, 9}) を最後まで追う
上のプログラムを maxIndex({5, 18, 28, 20, 21, 9}) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。
| # | 行 | したこと | data | pos | i |
|---|---|---|---|---|---|
| 1 | 2 | 宣言 | {5, 18, 28, 20, 21, 9} | 1 | — |
| 2 | 3 | 宣言 | {5, 18, 28, 20, 21, 9} | 1 | 未設定 |
| 3 | 4 | 繰返しの初期化 | {5, 18, 28, 20, 21, 9} | 1 | 2 |
| 4 | 4 | 条件判定(真) | {5, 18, 28, 20, 21, 9} | 1 | 2 |
| 5 | 5 | 条件判定(真) | {5, 18, 28, 20, 21, 9} | 1 | 2 |
| 6 | 6 | 代入 | {5, 18, 28, 20, 21, 9} | 2 | 2 |
| 7 | 4 | 繰返しの更新 | {5, 18, 28, 20, 21, 9} | 2 | 3 |
| 8 | 4 | 条件判定(真) | {5, 18, 28, 20, 21, 9} | 2 | 3 |
| 9 | 5 | 条件判定(真) | {5, 18, 28, 20, 21, 9} | 2 | 3 |
| 10 | 6 | 代入 | {5, 18, 28, 20, 21, 9} | 3 | 3 |
| 11 | 4 | 繰返しの更新 | {5, 18, 28, 20, 21, 9} | 3 | 4 |
| 12 | 4 | 条件判定(真) | {5, 18, 28, 20, 21, 9} | 3 | 4 |
| 13 | 5 | 条件判定(偽) | {5, 18, 28, 20, 21, 9} | 3 | 4 |
| 14 | 4 | 繰返しの更新 | {5, 18, 28, 20, 21, 9} | 3 | 5 |
| 15 | 4 | 条件判定(真) | {5, 18, 28, 20, 21, 9} | 3 | 5 |
| 16 | 5 | 条件判定(偽) | {5, 18, 28, 20, 21, 9} | 3 | 5 |
| 17 | 4 | 繰返しの更新 | {5, 18, 28, 20, 21, 9} | 3 | 6 |
| 18 | 4 | 条件判定(真) | {5, 18, 28, 20, 21, 9} | 3 | 6 |
| 19 | 5 | 条件判定(偽) | {5, 18, 28, 20, 21, 9} | 3 | 6 |
| 20 | 4 | 繰返しの更新 | {5, 18, 28, 20, 21, 9} | 3 | 7 |
| 21 | 4 | 条件判定(偽) | {5, 18, 28, 20, 21, 9} | 3 | 7 |
| 22 | 9 | 戻る(3) | {5, 18, 28, 20, 21, 9} | 3 | 7 |
この例題で問われること
問 maxIndex({5, 18, 28, 20, 21, 9}) を呼び出したときの戻り値はどれか。
答え 3
- 戻り値になる pos は、1 → 2 → 3 と変わります。
- 9行目で返す時点の値 3 が答えです。
問 6行目を1回目に実行した直後の、変数 pos の値はどれか。
答え 2
- 6行目は全部で2回実行されます。
- 実行した直後の pos は、順に 2 → 3 です。
- 1回目の直後なので、答えは 2 です。
問 6行目が実行される回数はどれか。
答え 2
- 6行目が実行されるのは、5行目の条件が真になったときだけです。
- 5行目の条件は5回評価され、真になるのは2回です。したがって 6行目は2回実行されます。
練習問題 標準(5問)
本試験と同じくらいの量。レベル:入門
- 問題01 maxIndex({5, 7, 2, 3, 1})
- 問題02 maxIndex({1, 4, 7, 3})
- 問題03 maxIndex({1, 6, 8, 9, 2})
- 問題04 maxIndex({7, 2, 3, 9, 4})
- 問題05 maxIndex({1, 5, 4, 9, 7})
もっと解く(追加の10問)
練習問題 じっくり(10問)
長めのトレースで力をつける。レベル:入門
- 問題01 maxIndex({11, 12, 18, 7, 13})
- 問題02 maxIndex({1, 13, 17, 8, 30, 27, 23})
- 問題03 maxIndex({1, 10, 15, 21, 14, 30, 13})
- 問題04 maxIndex({1, 23, 21, 28, 16})
- 問題05 maxIndex({12, 8, 22, 2, 24, 20})
- 問題06 maxIndex({4, 13, 14, 16, 19, 24, 15})
- 問題07 maxIndex({23, 24, 13, 21, 11, 28, 2})
- 問題08 maxIndex({5, 23, 24, 8, 12})
- 問題09 maxIndex({25, 26, 17, 28, 7, 14, 24})
- 問題10 maxIndex({15, 22, 20, 30, 7, 19})
もっと解く(追加の20問)
- 問題11 maxIndex({1, 15, 16, 22, 13})
- 問題12 maxIndex({5, 9, 13, 11, 8})
- 問題13 maxIndex({2, 7, 22, 23, 30, 3})
- 問題14 maxIndex({1, 5, 28, 10, 2, 11})
- 問題15 maxIndex({7, 18, 29, 14, 26, 9, 25})
- 問題16 maxIndex({17, 9, 5, 4, 26, 28, 12})
- 問題17 maxIndex({14, 18, 6, 30, 21, 11})
- 問題18 maxIndex({17, 15, 23, 6, 12, 30, 10})
- 問題19 maxIndex({4, 20, 24, 5, 16})
- 問題20 maxIndex({6, 9, 25, 12, 30, 14})
- 問題21 maxIndex({17, 11, 21, 3, 24, 27, 19})
- 問題22 maxIndex({11, 14, 10, 17, 2})
- 問題23 maxIndex({13, 24, 25, 19, 11, 16, 23})
- 問題24 maxIndex({9, 21, 18, 8, 27, 17})
- 問題25 maxIndex({14, 18, 21, 2, 10, 19})
- 問題26 maxIndex({7, 11, 17, 25, 1, 23})
- 問題27 maxIndex({7, 20, 28, 23, 17, 16})
- 問題28 maxIndex({3, 14, 4, 16, 30, 12})
- 問題29 maxIndex({6, 1, 25, 14, 28, 4})
- 問題30 maxIndex({12, 26, 17, 18, 11, 29, 13})