ITパスポート 2022年 問96
問題文
関数calcXと関数calcYは、引数inDataを用いて計算を行い、その結果を戻り値とする。関数calcXをcalcX(1)として呼び出すと、関数calcXの変数numの値が、1→3→7→13と変化し、戻り値は13となった。関数calcYをcalcY(1)として呼び出すと、関数calcYの変数numの値が、1→5→13→25と変化し、戻り値は25となった。プログラム中のa, bに入れる字句の適切な組合せはどれか。


選択肢
ア:
イ:
ウ:
エ:(正解)
🔒 解説は解答すると表示されます
関数の繰り返し計算(calcX, calcY)【ITパスポート 解説】
正解の理由
関数に渡す値(引数(ひきすう:関数に入力する値))が1のとき、calcXでは変数numの値が 1 → 3 → 7 → 13 と変化し、最終戻り値が13になっています。これは各反復で
という更新を、i = 1, 2, 3 の3回行った結果と一致します。
また、calcYでは変数numが 1 → 5 → 13 → 25 と変化しています。これは同じ更新式
を i = 2, 4, 6 (つまり 2 から 6 まで 2 ずつ増やす)で3回繰り返した結果と一致します。
したがって、a に入る式は「num + 2 × i」、b に入るループは「i を 2 から 6 まで 2 ずつ増やす」である選択肢エが正しい組合せです。
解法ステップ
-
「calcX の変化」を確認する(inData = 1)。
- 初期:num = 1
- 1回目(i=1):num = 1 + 2×1 = 3
- 2回目(i=2):num = 3 + 2×2 = 7
- 3回目(i=3):num = 7 + 2×3 = 13 → 1 → 3 → 7 → 13(合致)
-
「calcY の変化」を確認する(inData = 1)。
- b が「i を 2 から 6 まで 2 ずつ増やす」(i = 2,4,6)の場合:
- 初期:num = 1
- 1回目(i=2):num = 1 + 2×2 = 5
- 2回目(i=4):num = 5 + 2×4 = 13
- 3回目(i=6):num = 13 + 2×6 = 25 → 1 → 5 → 13 → 25(合致)
- b が「i を 2 から 6 まで 2 ずつ増やす」(i = 2,4,6)の場合:
-
よって a = num + 2 × i、b = i を 2 から 6 まで 2 ずつ増やす が正しい。
(まとめ)a 列は「num + 2 × i」、b 列は「i を 2 から 6 まで 2 ずつ増やす」=選択肢エ。
選択肢別の誤答解説
-
ア(a = 2 × num + i、b = i を 1 から 7 まで 3 ずつ増やす)
- calcX(i=1,2,3)で計算すると最終値は 19 になります(1→3→8→19)。calcX の与えられた推移(1→3→7→13)と合いません。
- calcY でも最終値は 27 となり不一致です。
-
イ(a = 2 × num + i、b = i を 2 から 6 まで 2 ずつ増やす)
- a が「2 × num + i」だと calcX の途中値が合いません(同様に 1→3→8→19)。
- calcY でも最終値が 30 となり不一致です。
-
ウ(a = num + 2 × i、b = i を 1 から 7 まで 3 ずつ増やす)
- a の式自体は calcX の変化(1→3→7→13)を満たします。
- しかし calcY の与えられた途中値は 1 → 5 → 13 → 25 ですが、この選択肢の b(i=1,4,7)で計算すると calcY の途中値は 1 → 3 → 11 → 25 になります。最終値は25で一致しますが、途中の変化(特に最初のステップ)が問題文と異なるため不正解です。
- 具体的:i=1 のとき 1 + 2×1 = 3(ここが 5 であるべき)
-
エ(a = num + 2 × i、b = i を 2 から 6 まで 2 ずつ増やす)
- calcX、calcY ともに問題文のすべての中間値と最終値に一致します。よって正解です。
よくある誤解
- 「戻り値だけ見れば良い」と考える誤り
- 最終の戻り値が一致しても、途中の値が問題文と違う場合は誤りです。問題は途中の変化(列挙された値の推移)も指定しています。
- for文の増分(ステップ)を見落とすミス
- 「1から7まで3ずつ増やす」と「2から6まで2ずつ増やす」はどちらも3回の繰り返しに見えても、i の値が違い、結果に大きく影響します。i の実際の値を列挙して確認しましょう。
- 更新式の左右を入れ替えて考えるミス
- たとえば「2 × num + i」と「num + 2 × i」は似て見えますが、挙動が全く違います。代入は現在の num を基に計算されることを意識してください。
補足コラム
- for文(繰り返し処理をする文)は「何回繰り返すか」だけでなく「どの値を使うか(開始値・終了値・増分)」が非常に重要です。現場でもループのインデックス(i)の取り方を誤るバグはよくあります。
- 今回は「差分」を見る方法が有効でした。数列の差(1→3→7→13 の差は 2,4,6)を見ると更新が「2×i」であることがすぐに分かります。覚えやすい手法です。
FAQ
Q1. 最終値だけが合えば正解ではないのですか?
A1. 問題文が途中の変化(列挙された値)を与えている場合は、途中の値も一致している必要があります。最終値のみ一致していても不正解になることがあります。
A1. 問題文が途中の変化(列挙された値)を与えている場合は、途中の値も一致している必要があります。最終値のみ一致していても不正解になることがあります。
Q2. 「i を 2 から 6 まで 2 ずつ増やす」は何回繰り返しますか?
A2. i の値は 2, 4, 6 の3回です。開始値と終了値、増分を実際に列挙して確認しましょう。
A2. i の値は 2, 4, 6 の3回です。開始値と終了値、増分を実際に列挙して確認しましょう。
Q3. 数列の差を見るとはどういう方法ですか?
A3. 連続する項の差を取ることで更新の規則が見えることが多いです。今回なら差が 2,4,6 と増えており「2×i」を使っていると推測できます。
A3. 連続する項の差を取ることで更新の規則が見えることが多いです。今回なら差が 2,4,6 と増えており「2×i」を使っていると推測できます。
関連キーワード: 繰返し, for文, ループ, インデックス, 更新式, 差分解析, 累積計算, 代入演算, デバッグ, アルゴリズム

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

