基本情報技術者試験「ループ」の問題
次の手続 halveCount は、正の整数 n を 2 で割る(整数除算で小数部切り捨て)操作を 0 になるまで繰り返した回数を返すことを意図している。「÷ の商」は整数除算を表す。n=40 のとき正しく 6 を返すよう、空欄 [ a ] に入れる継続条件として適切なものはどれか。
○整数型: halveCount(整数型: n)
整数型: cnt ← 0
while ( [ a ] )
n ← (n ÷ 2) の商
cnt ← cnt + 1
endwhile
return cntアn > 1
イn > 2
ウn > 0
エn > 0 かつ n が偶数
正解
ウ.n > 0
『0 になるまで』割り続けるので n が 1 でも本体を実行する必要があり、継続条件は n > 0。40→20→10→5→2→1→0 の 6 回で停止し cnt=6 となるため ウが正しい。
?選択肢ごとの解説
ア ×n > 1 では n=1 になった時点で停止し、1→0 の最後の 1 回を数えず cnt=5 となる off-by-one の誤りである。
イ ×n > 2 では n=2 で停止し、2→1, 1→0 の 2 回を落として cnt=4 となる、下限を高く取った誤りである。
ウ ○『0 になるまで』割り続けるので n が 1 でも本体を実行する必要があり、継続条件は n > 0。40→20→10→5→2→1→0 の 6 回で停止し cnt=6 となるため ウが正しい。
エ ×n > 0 かつ n が偶数では n=5(奇数)の時点で停止し cnt=3 となり、不要な偶数条件で早期終了する誤りである。
✎くわしく
反復回数を数える問題では『どの値まで本体を実行するか』が継続条件で決まる。0 まで割り切るには n=1 のときも実行する n > 0 が必要で、n > 1 にすると最後の 1 回を落とす。
✓本番での押さえどころ
試験のコツ
n が 1 のとき本体を実行すべきかを確認し、実行が必要なら下限を 0 超とする。
覚え方
『0 になるまで=0 より大きい間』と覚える。
よくある誤り
n > 1 で止めて最終ステップを数え落とす off-by-one が最も多い。
アルゴリズムとプログラミングの他の問題
次の擬似言語で表される手続 sumOdd を、引数として要素数 5 の整数型の配列 {12, 125, 1008,…次の擬似言語は、整数型の配列 arr に対して隣接交換を行う手続の一部であり、外側ループの 1 回目(1…次の擬似言語は昇順に整列された配列 arr に対する二分探索の手続である。arr = {2, 4, 6, 8, 10,…次の擬似言語で表される再帰手続 f を、引数 n = 20 で呼び出したとき、戻り値として返される値はどれか。
```…単方向連結リストの各ノードはメンバ val(整数)と next(次ノードへの参照。なければ NULL)をもつ。先頭ノード…スタックに対する push(積む)と…
この問題を、AIの8-ways解説つきで。
無料ではじめる →基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。
ukamiru 過去問 · 基本情報技術者試験 · fe-b-algo-0166