次の関数searchCountは、昇順の配列から31を二分探索し、発見までのループ回数countを返す。返される値はいくつか。配列の要素番号は1から始まり、「÷ 2 の商」は小数部を切り捨てた整数とする。 ○ 整数型: searchCount() 整数型の配列: a ← {4, 9, 15, 23, 31, 46, 57} 整数型: left ← 1 整数型: right ← 7 整数型: mid 整数型: count ← 0 while (left <= right) mid ← (left + right) ÷ 2 の商 count ← count + 1 if (a[mid] = 31) return count elseif (a[mid] < 31) left ← mid + 1 else right ← mid - 1 endif endwhile return count
本サイトで独自に作成。IPAの試験問題からの転載ではありません。
公開日:
選択肢を選んで、答え合わせをしましょう。
回答せずに正解・解説を確認する
正解:ウ 3
この表示だけでは、回答数や正答率は変わりません。
解説
1回目はleft=1、right=7からmid=4となり、a[4]=23が31より小さいためleft=5です。2回目はmid=6でa[6]=46が大きいためright=5です。3回目はmid=5でa[5]=31が一致します。countは各ループで1ずつ増えるので3を返します。
最初に見るのは中央のa[4]=23で、31ではありません。
2回目に見るa[6]=46も一致しないため、もう1回探索します。
参照する要素番号は4 → 6 → 5で、3回目に発見します。
3回目にreturnするので4回目のループは実行しません。
関連知識
探索範囲は両端を含む区間[left,right]です。中央と一致しなかったとき、mid自体も候補から除くため、mid+1またはmid−1で範囲を更新します。
間違えやすいポイント
countは条件式を評価した総回数ではなく、while本体の実行回数です。equalsと大小比較を別々に数えないようにします。
覚え方
left・mid・rightを毎回一行で記録。
実務での意味
探索処理の境界更新を検証するとき、見つかる場合と見つからない場合の両方を表で確認します。
解説:本サイト編集部によるオリジナル文章