過去問解きまくり研究所 ホーム

令和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要素から 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 と同じです。

再帰を繰返しに直す問題では、代入の順序を追って、空欄の時点で各要素がどの値を表しているかを書き出すのが確実な見分け方です。

ほかの選択肢はなぜ違うのか

出典:令和8年度 基本情報技術者試験 科目B 問3

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)