基本情報技術者試験「再帰」の問題
次の擬似言語は再帰で配列 arr の先頭 n 要素の合計を求める手続である。arr = {7, 12, 5, 20, 6}(要素数 5、添字は 1 から)に対し sumArr(arr, 5) を実行したとき、戻り値はどれか。
○整数型: sumArr(整数型の配列: arr, 整数型: n)
if (n が 0 と等しい)
return 0
endif
return arr[n] + sumArr(arr, n - 1)ア43
イ38
ウ50
エ500
正解
ウ.50
再帰は末尾要素 arr[n] を足して n を 1 減らす操作を n=0(0 を返す)まで繰り返す。arr の全要素 7+12+5+20+6 = 50 を合算するため ウが正しい。
?選択肢ごとの解説
ア ×先頭要素 arr[1]=7 を足し忘れた 12+5+20+6=43 であり、基底を n=1 で止めて最後の 1 要素を落とした off-by-one の誤りである。
イ ×末尾要素 arr[5]=6 を含めず 7+12+5+20=44… ではなく 12+20+6=38 のように一部要素を取りこぼした集計の誤りである。
ウ ○再帰は末尾要素 arr[n] を足して n を 1 減らす操作を n=0(0 を返す)まで繰り返す。arr の全要素 7+12+5+20+6 = 50 を合算するため ウが正しい。
エ ×合計 50 の桁を取り違えて 10 倍に膨らませた 500 とした桁の誤りである。
✎くわしく
再帰による配列和は『末尾から 1 要素ずつ取り出して基底まで降り、帰りで合算する』構造である。基底を n=0 とするか n=1 とするかで先頭要素の扱いが変わる。
✓本番での押さえどころ
試験のコツ
再帰を sumArr(arr,5)=arr[5]+sumArr(arr,4)=… と展開し、基底 sumArr(arr,0)=0 まで書き切る。
覚え方
『末尾から削って 0 で止める、帰りに足す』と再帰の往復を覚える。
よくある誤り
基底を n=1 と誤り先頭要素を落とすミス、要素の取りこぼしが多い。
アルゴリズムとプログラミングの他の問題
次の擬似言語で表される手続 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-0047