戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2016年 春期 午前(科目A)07


問題文

問7nの階乗を再帰的に計算する関数の定義において、aに入れるべき式はどれか。ここで、は非負の整数とする。
のとき、
のとき、

選択肢

(正解)

🔒 解説は解答すると表示されます

階乗の再帰関数【午前解説】

正解の理由

正解:
階乗は数学的に と定義されます。再帰関数 に対応させると、 の場合は となり、基底ケース と合わせて全ての非負整数 に対して正しい値を返します。選択肢ウだけがこの定義を正確に表現しています。

解法ステップ

  1. 問題の対象が「階乗」であることを確認する。数学的定義は
  2. 階乗の再帰定義 を思い出す。
  3. それを関数 に置き換え、 のとき とする。
  4. 基底ケース に対して が与えられていることを確認して終了。

選択肢別の誤答解説

  • ア:
    誤り。階乗は乗算の反復であり、加算では正しい値になりません(例: だが は 5)。
  • イ:
    誤り。右辺に が残るため、再帰で引数が減らず無限ループ(無限再帰)になります。
  • :
    正解。数学的定義 に一致し、基底 と合わせて正しく停止します。
  • エ:
    誤り。引数 が変わらないため無限再帰になるほか、演算も階乗定義に合致しません。

よくある誤解

    1. 加算と乗算を混同する:階乗は掛け算の繰り返しなので (ア)は誤りです。
    1. 引数が変わらない再帰: を右辺にそのまま残す(イ, エ)は無限再帰を招きます。
    1. 基底ケースを忘れると停止しない:必ず のような停止条件を確認する必要があります。

補足コラム

  • 実装例(Python):
def F(n):
    if n == 0:
        return 1
    else:
        return n * F(n-1)
  • 実践上の注意:再帰深度が大きいとスタックオーバーフロー(RecursionError)が起きるため、大きな はループで計算するか、言語の再帰深度設定を考慮してください。
  • 最適化:尾再帰最適化がある言語では累積引数を使った実装(尾再帰形)で効率化できますが、Pythonは標準で尾再帰最適化を行いません。
  • オーバーフロー:大きな階乗は桁数が急増するため、整数の扱いに注意(任意精度整数を持たない言語では溢れる)。

FAQ

Q1. なぜ基底ケースが なのですか?
A1. 階乗の定義で 0! は 1 と定められており、再帰を停止させるための必須条件です。
Q2. はどうなるのですか?
A2. で、1! = 1 になります。
Q3. 再帰でなく反復(ループ)で書いた方が良いですか?
A3. 大きな を扱う場合はループの方がスタックを消費せず安全です。学習では再帰定義を理解することが重要です。

関連キーワード: 再帰、階乗、基底ケース、無限再帰、スタックオーバーフロー、尾再帰最適化、アルゴリズム、漸化式、関数定義、演算子の意味
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について