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に入れる字句の適切な組合せはどれか。


選択肢
ア:
イ:
ウ:
エ:(正解)
🔒 解説は解答すると表示されます
関数の繰り返し計算【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パスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

