令和5年度64テクノロジ系

ITパスポート 令和5年度 問64:algorithmに関する問題

関数sigmaは,正の整数を引数maxで受け取り,1からmaxまでの整数の総和を戻り値とする。プログラム中のaに入れる字句として,適切なものはどれか。[プログラム] O整数型: sigma(整数型: max) / 整数型: calcX ← 0 / 整数型: n / for (n を 1 から max まで 1 ずつ増やす) / [a] / endfor / return calcX

  • acalcX ← calcX × n
  • bcalcX ← calcX + 1
  • ccalcX ← calcX + n正答
  • dcalcX ← n
正答:CcalcX ← calcX + n

AI解説(初心者・標準・上級)

理解度に合わせて3レベルの解説を無料で読めます。

初心者向けまずはここから。やさしく要点を解説

答えは c「calcX ← calcX + n」 です。

このプログラムは「1から順番に数を足していって、合計を出す」計算をしています。たとえばmaxが3なら、1+2+3=6を求めたいわけです。

計算用の入れ物 calcX に、いまの数 n(1→2→3…)をどんどん足していけば合計になります。だから「calcX に n を足す」が正解。

👉 覚え方:「合計=今ある合計+新しい数」。貯金箱に毎回お金を足していくイメージ。

ほかの選択肢:a ×(かけ算)=合計じゃなく掛け算になる/b +1=回数を数えるだけ/d n を入れ直す=最後の数しか残らない。

標準試験対策の基準レベル

なぜこれが正解か

正解は c「calcX ← calcX + n」。求めるのは1〜maxの総和。`calcX`を0で初期化し、ループで`n`が1,2,…,maxと変化するたびに現在の合計に n を加算すれば、ループ終了時に総和が得られる。max=4なら 0+1+2+3+4=10。

各選択肢の解説

  • a `calcX × n`:乗算。初期値0なので結果は常に0(しかも総和でなく総積の発想)。
  • b `calcX + 1`:毎回1だけ加算=ループ回数(=max)を数えるだけ。
  • d `calcX ← n`:代入なので前の値が消え、最後のnすなわちmaxだけが残る。

覚え方・ひっかけ注意

累計(合計)の定石は「変数 ← 変数 + 加える値」。`+1`は“カウンタ”、`+n`は“総和”、`×n`は“階乗・総積”と用途で区別。初期値が0か1かも要チェック(総和は0、総積は1始まり)。

上級誤答論破・背景理論まで深掘り

理論的背景

本問は累算(Accumulation)パターンの基本を問うアルゴリズム問題であり、「1からmaxまでの整数の総和を求める」という明確な仕様に対して適切な実装を選択させる。

累算パターンの一般形:「合計変数 ← 合計変数 + 加算する値」という代入文のパターンは、プログラミングの基本中の基本であり、ループの各反復で累積和を更新していく。本問では `calcX ← calcX + n`(選択肢c)がこれに当たる。

初期値の設定も重要な設計判断である。和の累算は0で初期化する(和の単位元は0)。積の累算は1で初期化する(積の単位元は1)。初期値を誤ると(例:和の累算を1で初期化すると、結果が1だけ余分になる)バグとなる。本問では `calcX ← 0` で正しく初期化されている。

ループ不変条件(Loop Invariant)の観点からこのアルゴリズムの正しさを証明できる。「ループのk回目の開始時点でcalcX=1から(k-1)までの和(k=1のとき0)」という不変条件が、初期化と各反復のcalcX ← calcX + nによって維持され、nがmax+1になって終了する時点でcalcX=1からmaxまでの和が確定する。

実務での使われ方

累算パターンはすべてのプログラミング言語・パラダイムに普遍的に存在する基本計算パターンである。命令型プログラミングでは `sum = sum + value`(または `sum += value`)という形式、関数型プログラミングでは `reduce`(fold)操作として表現される。Pythonでは `sum(range(1, max+1))` または `functools.reduce(lambda acc, n: acc + n, range(1, max+1), 0)` が対応する表現である。

実際のアプリケーションでの応用例として、給与計算(全社員の給与合計)・在庫管理(全品目の在庫金額合計)・ウェブアクセスログ解析(期間内の総アクセス数)・統計計算(データセットの合計・平均の分子計算)など、大量データの集計処理のすべてに累算パターンが使われる。データベースのSQLでいえば `SELECT SUM(column) FROM table` に相当する処理をプログラムで実装したものである。

本問の総和計算は数学的には「ガウスの公式(等差数列の和)」で閉形式に解ける。1からmaxまでの和 = max×(max+1)/2 という公式で、ループを使わずO(1)で計算できる。例えばmax=100なら100×101/2=5050。この公式はカール・フリードリヒ・ガウスが小学生の時に発見したとされる逸話で有名。ただし本問はプログラムの動作理解(逐次加算のアルゴリズム)を問うており、閉形式での計算ではなく反復処理での実装が問題の文脈である。

試験での位置づけ

ITパスポートのテクノロジ系・アルゴリズム分野では、疑似言語プログラムの穴埋め問題が配点が高く重要な出題形式の一つである。本問のように「関数の仕様(何を計算するか)を読んで適切な実装(ループ内の代入文)を選ぶ」形式は、(1)仕様の正確な理解、(2)各選択肢の動作の論理的検証、(3)初期値・ループ構造との整合性確認の3ステップで正答を導く。

4つの選択肢のそれぞれが「別の典型的なパターン(乗算・カウンタ・総和・代入)」を表しており、それぞれを小さいmaxの値(例:max=3)で手計算してみることが確実な検証手段となる。max=3の場合、正解のcalcX ← calcX + nなら結果は0+1+2+3=6、加算する値の間違いcalcX ← calcX + 1なら1+1+1=3(単にmaxを返す)、calcX ← calcX × nなら0×1×2×3=0(初期値0の乗算は常に0)、calcX ← nなら最後のnすなわち3だけが残る。

選択肢の発展補足

選択肢a(calcX ← calcX × n)が誤りの理由:初期値が0のため、最初のループ(n=1)で calcX=0×1=0となり、以降どれだけかけ算を繰り返しても0のまま。仮に初期値が1であれば1×2×3×...×maxという階乗(Factorial)の計算になるが、初期値0との組合せでは常に0になるバグとなる。「掛け算の累算は初期値1」という原則を知っていれば即座に排除できる。

選択肢b(calcX ← calcX + 1)が誤りの理由:毎回1だけ加算するため、max回ループが実行されるとcalcXはmaxに等しくなる(1+1+1+...=max個分)。これは総和ではなく「ループ回数のカウンタ」であり、単に変数maxの値を別の変数に作り直しているだけになる。「+n(変化する値)」と「+1(固定値)」の違いが「総和」と「カウンタ」の違いを生む。

選択肢d(calcX ← n)が誤りの理由:代入(←)はcalcXの前の値を破棄してnを新たに格納する操作。ループの各反復でcalcXはn(1,2,3,...,max)に上書きされ続けるため、ループ終了時にはcalcXはループの最後の値であるmaxのみが残る。「足し込む」ではなく「置き換える」という操作の違いが理解の鍵。初心者が最も陥りやすいバグパターンの一つであり、コードレビューでも発見されやすい典型的な論理エラーである。

出典・引用について

出典:IPA(情報処理推進機構)公式 ITパスポート試験 令和5年度64/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。

テクノロジ系の他の過去問

55
security
56
database
57
database
58
technology_element
59
network

あなたの弱点を診断して、合格までの最短ルートを

この分野を連続演習し、AIがあなたの弱点を分析。合格ナビならITパスポートの過去問を解きながら学べます。