閉じる
午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】

基本情報技術者令和8年度 科目B 問3

問3

 次のプログラム中の に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。

 関数 func1 に与える引数と,関数 func2 に与える引数とが同じとき,二つの関数は同じ値を返す。プログラムでは,配列の領域外を参照してはならないものとする。

〔プログラム〕
b03_1.png/image-size:359×341
  • 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]

分類 :

アルゴリズムとプログラミング » プログラムの基本要素

正解 :

解説 :

この問題では、同じ引数 n を与えたとき、関数 func1 と関数 func2 が同じ値を返すように、func2 の空欄に入る式を考えます。

まず、関数 func1 の動作を確認します。
func1 では、nが2以下の場合には1を返します。
func1(1) = 1
func1(2) = 1
nが3以上の場合には、次の式で値を求めます。
2 × func1(n-2) + func1(n-1)
つまり、2個前の値を2倍したものに1個前の値を加算して、現在の値を求めるという処理です。実際に順番に計算すると、次のようになります。
func1(1) = 1
func1(2) = 1
func1(3) = 2×1+1 = 3
func1(4) = 2×1+3 = 5
func1(5) = 2×3+5 = 11
したがって、func2 でも、この「2個前の値×2+1個前の値」という計算を再現すればよいことがわかります。

次に、関数 func2 の動作を分析します。
func2では、最初に配列 data を次のように初期化しています。
data = {1, 1, 1}
nが3より小さい場合には繰返し処理を行わず、そのまま data[3] の1を返します。これは、func1(1)とfunc1(2)がともに1であることと一致します。nが3以上の場合は、繰返し処理の中で最初に以下の処理を行っています。
data[1] ← data[2]
data[2] ← data[3]
これは、過去の計算結果を一つずつ前へずらす処理となります。繰返し処理でi番目の値を求めるとき、この2つの代入を行った後の各要素は、次の値を保持することになります。
data[1] … 2個前の値
data[2] … 1個前の値
data[3] … 1個前の値(これからi番目の値を格納する場所)
data[3] に格納すべきは、i番目の値です。func1 の動作で確認したとおり、これは「2個前の値×2+1個前の値」で求められるため、配列 data の要素と対応させると、空欄には以下の式が当てはまります。
2 × data[1] + data[2]
したがって「ア」が正解です。

実際に処理を追うと分かりやすくなります。
//n = 3
data[1] ← data[2] → 1
data[2] ← data[3] → 1
data[3] ← 2×1+1 → 3
data = {1, 1, 3}
//n = 4
data[1] ← data[2] → 1
data[2] ← data[3] → 3
data = {1, 3, 5}
このように、func1 の計算結果と一致します。

なお、選択肢には data[i-1] や data[i-2] を使う式もありますが、data の要素は data[1]~data[3] の三つだけです。例えば i=5 になると data[i-1] は data[4] となり、配列の領域外を参照してしまいます。問題文には「配列の領域外を参照してはならない」とあるため、これらの選択肢は除外できます。

Pagetop