最大値の位置|擬似言語のトレース解説と練習問題

レベル:入門 / タグ:for・if・配列

関数 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}) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。

#行したことdataposi
12宣言{5, 18, 28, 20, 21, 9}1—
23宣言{5, 18, 28, 20, 21, 9}1未設定
34繰返しの初期化{5, 18, 28, 20, 21, 9}12
44条件判定(真){5, 18, 28, 20, 21, 9}12
55条件判定(真){5, 18, 28, 20, 21, 9}12
66代入{5, 18, 28, 20, 21, 9}22
74繰返しの更新{5, 18, 28, 20, 21, 9}23
84条件判定(真){5, 18, 28, 20, 21, 9}23
95条件判定(真){5, 18, 28, 20, 21, 9}23
106代入{5, 18, 28, 20, 21, 9}33
114繰返しの更新{5, 18, 28, 20, 21, 9}34
124条件判定(真){5, 18, 28, 20, 21, 9}34
135条件判定(偽){5, 18, 28, 20, 21, 9}34
144繰返しの更新{5, 18, 28, 20, 21, 9}35
154条件判定(真){5, 18, 28, 20, 21, 9}35
165条件判定(偽){5, 18, 28, 20, 21, 9}35
174繰返しの更新{5, 18, 28, 20, 21, 9}36
184条件判定(真){5, 18, 28, 20, 21, 9}36
195条件判定(偽){5, 18, 28, 20, 21, 9}36
204繰返しの更新{5, 18, 28, 20, 21, 9}37
214条件判定(偽){5, 18, 28, 20, 21, 9}37
229戻る(3){5, 18, 28, 20, 21, 9}37

この例題で問われること

問 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問)

本試験と同じくらいの量。レベル:入門

  1. 問題01 maxIndex({5, 7, 2, 3, 1})
  2. 問題02 maxIndex({1, 4, 7, 3})
  3. 問題03 maxIndex({1, 6, 8, 9, 2})
  4. 問題04 maxIndex({7, 2, 3, 9, 4})
  5. 問題05 maxIndex({1, 5, 4, 9, 7})
もっと解く(追加の10問)
  1. 問題06 maxIndex({4, 8, 6, 1})
  2. 問題07 maxIndex({2, 6, 4, 9, 7})
  3. 問題08 maxIndex({3, 2, 9, 6})
  4. 問題09 maxIndex({5, 4, 7, 9, 6})
  5. 問題10 maxIndex({7, 9, 6, 3, 5})
  6. 問題11 maxIndex({5, 8, 9, 7, 6})
  7. 問題12 maxIndex({8, 4, 9, 6})
  8. 問題13 maxIndex({3, 8, 6, 7})
  9. 問題14 maxIndex({8, 4, 9, 6, 5})
  10. 問題15 maxIndex({2, 5, 6, 7, 4})

練習問題 じっくり(10問)

長めのトレースで力をつける。レベル:入門

  1. 問題01 maxIndex({11, 12, 18, 7, 13})
  2. 問題02 maxIndex({1, 13, 17, 8, 30, 27, 23})
  3. 問題03 maxIndex({1, 10, 15, 21, 14, 30, 13})
  4. 問題04 maxIndex({1, 23, 21, 28, 16})
  5. 問題05 maxIndex({12, 8, 22, 2, 24, 20})
  6. 問題06 maxIndex({4, 13, 14, 16, 19, 24, 15})
  7. 問題07 maxIndex({23, 24, 13, 21, 11, 28, 2})
  8. 問題08 maxIndex({5, 23, 24, 8, 12})
  9. 問題09 maxIndex({25, 26, 17, 28, 7, 14, 24})
  10. 問題10 maxIndex({15, 22, 20, 30, 7, 19})
もっと解く(追加の20問)
  1. 問題11 maxIndex({1, 15, 16, 22, 13})
  2. 問題12 maxIndex({5, 9, 13, 11, 8})
  3. 問題13 maxIndex({2, 7, 22, 23, 30, 3})
  4. 問題14 maxIndex({1, 5, 28, 10, 2, 11})
  5. 問題15 maxIndex({7, 18, 29, 14, 26, 9, 25})
  6. 問題16 maxIndex({17, 9, 5, 4, 26, 28, 12})
  7. 問題17 maxIndex({14, 18, 6, 30, 21, 11})
  8. 問題18 maxIndex({17, 15, 23, 6, 12, 30, 10})
  9. 問題19 maxIndex({4, 20, 24, 5, 16})
  10. 問題20 maxIndex({6, 9, 25, 12, 30, 14})
  11. 問題21 maxIndex({17, 11, 21, 3, 24, 27, 19})
  12. 問題22 maxIndex({11, 14, 10, 17, 2})
  13. 問題23 maxIndex({13, 24, 25, 19, 11, 16, 23})
  14. 問題24 maxIndex({9, 21, 18, 8, 27, 17})
  15. 問題25 maxIndex({14, 18, 21, 2, 10, 19})
  16. 問題26 maxIndex({7, 11, 17, 25, 1, 23})
  17. 問題27 maxIndex({7, 20, 28, 23, 17, 16})
  18. 問題28 maxIndex({3, 14, 4, 16, 30, 12})
  19. 問題29 maxIndex({6, 1, 25, 14, 28, 4})
  20. 問題30 maxIndex({12, 26, 17, 18, 11, 29, 13})

ほかのアルゴリズム