システムアーキテクト 2025年 午前2 問08
問題文
プログラムの構造的な複雑度を測る尺度としてMcCabeが提唱したサイクロマティック複雑度がある。制御の流れが次のグラフで表されるプログラムのサイクロマティック複雑度は幾らか。ここで、エッジの個数をe、ノードの個数をnとし、サイクロマティック複雑度はe-n+2で求めるものとする。

選択肢
ア:3
イ:4(正解)
ウ:5
エ:7
サイクロマティック複雑度の計算【午前2 解説】
要点まとめ
- 結論→正解は イ:与えられたグラフのノード数とエッジ数を代入するとサイクロマティック複雑度は です。
- 根拠→サイクロマティック複雑度は制御フローグラフのエッジ数 とノード数 に対して で定義されるため、この定義をそのまま用います。
- 差がつくポイント→ノードやエッジを正確に数えること(重複辺や結合成分を見落とさない)と、別の定義(判定点数+1や )で整合性を取る確認が重要です。
正解の理由
与えられたグラフのノードは A,B,C,D,E の 5 箇所で、エッジは問題文の列挙で 7 本(A→B, A→C, B→C, B→E, C→D, C→E, D→E)です。公式に従いサイクロマティック複雑度を計算すると
よって正解は イ(4)です。
よくある誤解(2〜3 行)
- ノードとエッジのどちらかを数え間違えて異なる値を出してしまうことが多いです。
- 複数の辺や分離したサブグラフ(結合成分 P)を意識せずに計算する誤りもあります。
解法ステップ
- 問題図からノードを数える(A,B,C,D,E → )。
- 矢印(有向エッジ)を1本ずつ数える(列挙された 7 本 → )。
- 与えられた公式 に代入して計算する:。
- 必要なら別の見方(判定点数+1、あるいは )で結果が一致するか確認する。
選択肢別の誤答解説
- ア: 3 — これはエッジ数を 6 と数えて とした場合の誤答です。どの辺を見落としたかを確認してください。
- イ: イ(4) — 正解。ノード5、エッジ7 より になります。
- ウ: 5 — これはエッジを 8 本と誤って数えた場合(またはノードを 4 と誤認した場合)に生じる典型的なミスです。図の各矢印を一つずつ数え直してください。
- エ: 7 — 公式を誤って のように扱ったり、各分岐を過剰にカウントした場合に出る大きな誤答です。原理を確認しましょう。
補足コラム(関連知識など)
- 一般式は連結成分(独立した入口)を考慮して (P は入口の数)と表されます。通常の単一関数の CFG では なので です。
- 別の直感的な求め方として「判定点(if, while, for, case 等)の数 D に対して 」という方法があります。ただし switch/case はケース数に応じた調整が必要です(例:k 分岐なら k−1 と数える)。
- 実務ではサイクロマティック複雑度は独立経路数=テストケースの下限にもなるため、複雑度が高い関数はテストコストや保守性リスクが高いと判断されます。一般目安として 10 を超えると注意が必要です。
- 例(簡単なコードと計算):
def f(x):
if x > 0:
if x % 2 == 0:
return 1
else:
return 2
else:
return 3
# 判定点 D = 2 (外側 if と内側 if) → M = D + 1 = 3
FAQ
Q: サイクロマティック複雑度で入口(entry)や出口(exit)はどう扱いますか?
A: 入口・出口はノードとしてグラフに含まれますが、公式 がそれらを含めて正しく計算します。特別に加える必要はありません(ただし結合成分 P が複数ある場合は を用います)。
A: 入口・出口はノードとしてグラフに含まれますが、公式 がそれらを含めて正しく計算します。特別に加える必要はありません(ただし結合成分 P が複数ある場合は を用います)。
Q: ループやバックエッジはどうカウントしますか?
A: ループもエッジとして数えます。戻り(バックエッジ)があればそれもエッジなので に含めて計算します。
A: ループもエッジとして数えます。戻り(バックエッジ)があればそれもエッジなので に含めて計算します。
Q: switch/case はどう扱うのが安全ですか?
A: switch の場合は「分岐数 − 1」を判定点として数える方法が一般的です(各 case を個別の分岐と見なすと良い)。
A: switch の場合は「分岐数 − 1」を判定点として数える方法が一般的です(各 case を個別の分岐と見なすと良い)。
関連キーワード: サイクロマティック複雑度、McCabe, 制御フローグラフ、独立経路、判定点

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

