令和8年度試験問題 科目B 問3
問3解説へ
次のプログラム中の に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
関数 func1 に与える引数と,関数 func2 に与える引数とが同じとき,二つの関数は同じ値を返す。プログラムでは,配列の領域外を参照してはならないものとする。
〔プログラム〕
関数 func1 に与える引数と,関数 func2 に与える引数とが同じとき,二つの関数は同じ値を返す。プログラムでは,配列の領域外を参照してはならないものとする。
〔プログラム〕

- 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を返します。
次に、関数 func2 の動作を分析します。
func2では、最初に配列 data を次のように初期化しています。
実際に処理を追うと分かりやすくなります。
なお、選択肢には data[i-1] や data[i-2] を使う式もありますが、data の要素は data[1]~data[3] の三つだけです。例えば i=5 になると data[i-1] は data[4] となり、配列の領域外を参照してしまいます。問題文には「配列の領域外を参照してはならない」とあるため、これらの選択肢は除外できます。
まず、関数 func1 の動作を確認します。
func1 では、nが2以下の場合には1を返します。
func1(1) = 1
func1(2) = 1
nが3以上の場合には、次の式で値を求めます。func1(2) = 1
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個前の値」という計算を再現すればよいことがわかります。func1(2) = 1
func1(3) = 2×1+1 = 3
func1(4) = 2×1+3 = 5
func1(5) = 2×3+5 = 11
次に、関数 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[2] ← data[3]
data[1] … 2個前の値
data[2] … 1個前の値
data[3] … 1個前の値(これからi番目の値を格納する場所)
data[3] に格納すべきは、i番目の値です。func1 の動作で確認したとおり、これは「2個前の値×2+1個前の値」で求められるため、配列 data の要素と対応させると、空欄には以下の式が当てはまります。data[2] … 1個前の値
data[3] … 1個前の値(これからi番目の値を格納する場所)
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}
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[1] ← data[2] → 1
data[2] ← data[3] → 3
data = {1, 3, 5}
なお、選択肢には data[i-1] や data[i-2] を使う式もありますが、data の要素は data[1]~data[3] の三つだけです。例えば i=5 になると data[i-1] は data[4] となり、配列の領域外を参照してしまいます。問題文には「配列の領域外を参照してはならない」とあるため、これらの選択肢は除外できます。
広告