令和8年度 科目B 問3
アルゴリズム
再帰に関する問題
次のプログラム中の[ ]に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。
関数 func1 に与える引数と,関数 func2 に与える引数とが同じとき,二つの関数は同じ値を返す。プログラムでは,配列の領域外を参照してはならないものとする。
〔プログラム〕
○整数型: func1(整数型: n)
if (nが2以下)
return 1
endif
return 2 × func1(n - 2) + func1(n - 1)
○整数型: func2(整数型: n)
整数型の配列: data ← {1, 1, 1}
整数型: i
/* nが3より小さいときは繰返し処理を実行しない */
for (iを3からnまで1ずつ増やす)
data[1] ← data[2]
data[2] ← data[3]
data[3] ← [ ]
endfor
return data[3]- ア2 × data[1] + data[2]
- イ2 × data[2] + data[1]
- ウ2 × data[i - 1] + data[i - 2]
- エ2 × data[i - 2] + data[i - 1]
- オdata[3] + 2 × data[1] + data[2]
- カdata[3] + 2 × data[2] + data[1]
- キdata[3] + 2 × data[i - 1] + data[i - 2]
- クdata[3] + 2 × data[i - 2] + data[i - 1]
答えと解説を見る
✓ これが正解ア2 × data[1] + data[2]
解説
ずらした後の2要素から 2 × data[1] + data[2] を作ります。
func1 は、n が 2 以下なら 1 を返し、それ以外は 2 × func1(n - 2) + func1(n - 1) を返す再帰の関数です。func2 はこれを繰返しで計算し直したもので、配列 data の 3 要素に直近の値を覚えておく形になっています。軸は、空欄を実行する時点で data[1] と data[2] にそれぞれ何が入っているかです。
繰返しの中では、まず data[1] ← data[2]、data[2] ← data[3] と一つずつ前へずらします。i の回の始まりで data[2] が func1(i - 2)、data[3] が func1(i - 1) を持っているので、ずらした後は data[1] が func1(i - 2)、data[2] が func1(i - 1) になります。したがって data[3] に 2 × data[1] + data[2] を入れれば、func1(i) と同じ値になります。
値で確かめます。func1 は n = 3, 4, 5 で 3, 5, 11 です。func2 は data = {1, 1, 1} から始まり、i = 3 でずらした後も {1, 1, 1} で、data[3] ← 2 × 1 + 1 = 3 です。i = 4 では {1, 3, 3} にずらしてから 2 × 1 + 3 = 5、i = 5 では {3, 5, 5} から 2 × 3 + 5 = 11 となり、すべて一致します。n が 2 以下なら繰返しは実行されず、data[3] の初期値 1 が返るのも func1 と同じです。
再帰を繰返しに直す問題では、代入の順序を追って、空欄の時点で各要素がどの値を表しているかを書き出すのが確実な見分け方です。
ほかの選択肢はなぜ違うのか
- イ2 × data[2] + data[1…:係数 2 を掛ける相手が逆になっています。i = 3 では data[1] も data[2] も 1 なので偶然 3 が得られますが、i = 4 では data[1] = 1、data[2] = 3 で 2 × 3 + 1 = 7 となり、func1(4) の 5 と食い違います。
- ウ2 × data[i - 1] + da…:i に合わせて要素番号を動かす形ですが、data は 3 要素しかありません。i = 4 では古い値の残る data[3] を 2 倍して 2 × 3 + 3 = 9 となり、i = 5 では data[4] という領域外を参照してしまいます。
- エ2 × data[i - 2] + da…:i = 3 のときだけは 2 × data[1] + data[2] と同じ式になり 3 が出ます。しかし i = 4 では 2 × data[2] + data[3] = 2 × 3 + 3 = 9 で 5 にならず、i = 5 では data[4] を指して領域外になります。
- オdata[3] + 2 × data[1…:ずらした直後の data[3] には一つ前の回の値がまだ残っており、それを足すと余分になります。i = 3 で 1 + 2 × 1 + 1 = 4 となり、func1(3) の 3 と合いません。
- カdata[3] + 2 × data[2…:残っている古い data[3] を足したうえに、係数の掛け先も逆です。最初の i = 3 の回で 1 + 2 × 1 + 1 = 4 となり、この時点で func1(3) の 3 から外れます。
- キdata[3] + 2 × data[i…:古い data[3] を足す誤りと、i で要素番号を動かす誤りが重なっています。i = 3 で 1 + 2 × data[2] + data[1] = 4 となって 3 にならず、i = 5 では data[4] の領域外参照も起きます。
- クdata[3] + 2 × data[i…:最初の i = 3 で 1 + 2 × data[1] + data[2] = 4 となり、func1(3) の 3 と合いません。さらに i が 5 以上になると data[i - 1] が data[4] 以降を指すので、配列の領域外を参照します。
出典:令和8年度 基本情報技術者試験 科目B 問3
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)