線形探索|擬似言語のトレース解説と練習問題

レベル:入門 / タグ:while・and・配列・探索

関数 find は、配列 data を先頭から順に調べ、target と等しい最初の要素の要素番号を返す。見つからなければ 0 を返す。配列の要素番号は 1 から始まる。

プログラム

1○整数型: find(整数型の配列: data, 整数型: target)
2 整数型: i ← 1
3 while (i ≦ dataの要素数 and data[i] ≠ target)
4 i ← i + 1
5 endwhile
6 if (i ≦ dataの要素数)
7 return i
8 endif
9 return 0

何をしているか

配列を先頭から1つずつ調べ、目的の値と等しい要素が見つかったら、その位置を返します。条件は「まだ配列の中にいる」かつ「目的の値ではない」の2つを and でつないでいます。

トレースのコツ

  • 繰返しを抜ける理由は2つあります。見つかったか、配列の終わりを過ぎたかです。抜けたあとの i で、どちらだったかを見分けます。
  • i を進める回数は、「目的の値より前にある要素の数」と同じです。
  • 条件式が評価される回数は、i を進める回数より1回多くなります。最後に偽になる回があるからです。

よくある間違い

  • 戻り値を、見つけた値で答える。返すのは要素番号です。
  • 条件の2つの順番を気にしない。左の「i ≦ 要素数」を先に調べるので、範囲の外の要素を見にいかずに済んでいます。
  • 見つからなかったときの i を「要素数」と答える。実際は「要素数 + 1」になって繰返しを抜けます。

例題:find({6, 12, 20, 5, 15}, 15) を最後まで追う

上のプログラムを find({6, 12, 20, 5, 15}, 15) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。

#行したことdatatargeti
12宣言{6, 12, 20, 5, 15}151
23条件判定(真){6, 12, 20, 5, 15}151
34代入{6, 12, 20, 5, 15}152
43条件判定(真){6, 12, 20, 5, 15}152
54代入{6, 12, 20, 5, 15}153
63条件判定(真){6, 12, 20, 5, 15}153
74代入{6, 12, 20, 5, 15}154
83条件判定(真){6, 12, 20, 5, 15}154
94代入{6, 12, 20, 5, 15}155
103条件判定(偽){6, 12, 20, 5, 15}155
116条件判定(真){6, 12, 20, 5, 15}155
127戻る(5){6, 12, 20, 5, 15}155

この例題で問われること

問 find({6, 12, 20, 5, 15}, 15) を呼び出したときの戻り値はどれか。

答え 5

  • 戻り値になる i は、1 → 2 → 3 → 4 → 5 と変わります。
  • 7行目で返す時点の値 5 が答えです。

問 3行目の条件式が評価される回数はどれか。

答え 5

  • 3行目の条件式は5回評価され、真が4回、偽が1回です。

問 4行目を4回目に実行した直後の、変数 i の値はどれか。

答え 5

  • 4行目は全部で4回実行されます。
  • 実行した直後の i は、順に 2 → 3 → 4 → 5 です。
  • 4回目の直後なので、答えは 5 です。

練習問題 標準(10問)

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

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

ほかのアルゴリズム