ITパスポート 2023年 問64
問題文
関数sigmaは、正の整数を引数maxで受け取り、1からmaxまでの整数の総和を戻り値とする。プログラム中のaに入れる字句として、適切なものはどれか。
〔プログラム〕
○整数型: sigma(整数型: max)
整数型: calcX ← 0
整数型: n
for (nを1からmaxまで1ずつ増やす)
[ a ]
endfor
return calcX
選択肢
ア:calcX ← calcX × n
イ:calcX ← calcX + 1
ウ:calcX ← calcX + n(正解)
エ:calcX ← n
🔒 解説は解答すると表示されます
1からmaxまでの総和を求める関数sigma【ITパスポート 解説】
正解の理由
問題は「1からmaxまでの整数の総和」を返す関数sigmaを作ることです。ループでnを1からmaxまで順に動かしているので、各回で現在の値nを合計(累積)する必要があります。したがって、累積変数calcXに「現在のnを足す」処理、すなわち ウ の「calcX ← calcX + n」が適切です。これによりループ終了後にcalcXが1+2+...+maxの合計になります。
解法ステップ
- 問題文を確認:関数は引数max(正の整数)を受け取り、1からmaxまでの合計を返す。
- ループの役割を整理:for文でnが1→maxまで変化する。各回にnを合計に反映する必要がある。
- 累積変数の使い方:合計を保存する変数calcXは最初に0で初期化され、ループごとに更新される。更新は「今までの合計+今回の値」。
- 選択肢を照合:これができるのは ウ(calcX ← calcX + n)だけ。
- 小さな例で検算:max=5なら 0→0+1→1+2→3+3→6+4→10+5→15。期待通り1+2+3+4+5=15。
選択肢別の誤答解説
- ア: calcX ← calcX × n
- 意味:累積値にnを掛ける。初回は0×1=0で、その後も0のままか、もし初期値が0でないときは積の挙動となり、合計にはならない。例えばmax=5では最終的に0(あるいは不定の掛け算結果)になり、合計とは無関係。
- イ: calcX ← calcX + 1
- 意味:毎回1だけ増やす。これは「要素の個数」を数える処理になり、結果はmaxになる(maxが5なら5)。求める合計(例えば5なら15)とは異なる。
- ウ: calcX ← calcX + n
- 意味:正しい。毎回その回の値nを足していく。ループ後に1からmaxまでの合計が得られる。
- エ: calcX ← n
- 意味:毎回累積値を上書きしてしまう。ループ終了時は最後に代入されたn(=max)だけが残る。合計ではなく最大値が返る。
よくある誤解
- 「足すのではなく1を足せばよい」と思うミス
- calcX ← calcX + 1 は要素の数を数える処理で、合計にはならない点を混同しやすいです。
- 初期値の誤理解
- 累積変数calcXは0で初期化する必要があります。1などにすると結果がずれます。0である理由は「何も足していない状態の合計は0」だからです。
- 代入と加算の違いを見落とす
- calcX ← n は累積ではなく上書きです。過去の合計が消えるため合計は得られません。
補足コラム
- ループで合計を求める方法は「逐次累積(アキュムレータ)」と呼ばれます。累積変数(この例ではcalcX)に対して、各繰り返しで値を加えていく手法です。
- 数学的には、1からmaxまでの和はガウスの公式で直接求められます:
ループを回す代わりにこの式を使えば計算回数を減らせます(大きな数に有利)。 - 用語説明:
- 整数型:小数点のない数(例:1, 2, 3)を扱うデータ型のこと。
- 引数(ひきすう):関数に渡す入力値。ここではmaxが引数。
- 戻り値(もどりち):関数が結果として返す値。ここでは合計が戻り値。
簡単な実装例(Python)
def sigma(max):
calcX = 0 # 合計を保持する変数(整数型)
for n in range(1, max+1): # nを1からmaxまで増やす
calcX = calcX + n # 累積(これが正しい処理)
return calcX
print(sigma(5)) # 15 が出力される
# 公式を使う例
def sigma_formula(max):
return max * (max + 1) // 2
print(sigma_formula(5)) # 15
FAQ
Q1. calcXを0で初期化する理由は?
A1. 合計の初期状態は「何も足していない=0」です。もし1や他の値で初期化すると結果がずれます。
A1. 合計の初期状態は「何も足していない=0」です。もし1や他の値で初期化すると結果がずれます。
Q2. maxが0または負の値の場合はどうなる?
A2. 問題ではmaxは正の整数とあります。実装上は、maxが0だと合計は0、負ならループが実行されないかエラー扱いになります。現実の関数では入力の検証(負の値を受け取らないようにする)を行うことが望ましいです。
A2. 問題ではmaxは正の整数とあります。実装上は、maxが0だと合計は0、負ならループが実行されないかエラー扱いになります。現実の関数では入力の検証(負の値を受け取らないようにする)を行うことが望ましいです。
Q3. ループを使わずに速く求める方法は?
A3. 補足コラムにあるガウスの公式 を使えば1回の計算で結果が出ます。
A3. 補足コラムにあるガウスの公式 を使えば1回の計算で結果が出ます。
関連キーワード: 逐次累積、for文、アキュムレータ、合計の公式、整数初期化、ループ設計

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

