基本情報技術者 2016年 春期 午前(科目A) 問07
問題文
問7nの階乗を再帰的に計算する関数の定義において、aに入れるべき式はどれか。ここで、は非負の整数とする。
のとき、
のとき、
選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
階乗の再帰関数【午前解説】
正解の理由
正解:ウ
階乗は数学的に と定義されます。再帰関数 に対応させると、 の場合は となり、基底ケース と合わせて全ての非負整数 に対して正しい値を返します。選択肢ウだけがこの定義を正確に表現しています。
階乗は数学的に と定義されます。再帰関数 に対応させると、 の場合は となり、基底ケース と合わせて全ての非負整数 に対して正しい値を返します。選択肢ウだけがこの定義を正確に表現しています。
解法ステップ
- 問題の対象が「階乗」であることを確認する。数学的定義は 。
- 階乗の再帰定義 を思い出す。
- それを関数 に置き換え、 のとき とする。
- 基底ケース に対して が与えられていることを確認して終了。
選択肢別の誤答解説
- ア:
誤り。階乗は乗算の反復であり、加算では正しい値になりません(例: だが は 5)。 - イ:
誤り。右辺に が残るため、再帰で引数が減らず無限ループ(無限再帰)になります。 - ウ:
正解。数学的定義 に一致し、基底 と合わせて正しく停止します。 - エ:
誤り。引数 が変わらないため無限再帰になるほか、演算も階乗定義に合致しません。
よくある誤解
-
- 加算と乗算を混同する:階乗は掛け算の繰り返しなので (ア)は誤りです。
-
- 引数が変わらない再帰: を右辺にそのまま残す(イ, エ)は無限再帰を招きます。
-
- 基底ケースを忘れると停止しない:必ず のような停止条件を確認する必要があります。
補足コラム
- 実装例(Python):
def F(n):
if n == 0:
return 1
else:
return n * F(n-1)
- 実践上の注意:再帰深度が大きいとスタックオーバーフロー(RecursionError)が起きるため、大きな はループで計算するか、言語の再帰深度設定を考慮してください。
- 最適化:尾再帰最適化がある言語では累積引数を使った実装(尾再帰形)で効率化できますが、Pythonは標準で尾再帰最適化を行いません。
- オーバーフロー:大きな階乗は桁数が急増するため、整数の扱いに注意(任意精度整数を持たない言語では溢れる)。
FAQ
Q1. なぜ基底ケースが なのですか?
A1. 階乗の定義で 0! は 1 と定められており、再帰を停止させるための必須条件です。
A1. 階乗の定義で 0! は 1 と定められており、再帰を停止させるための必須条件です。
Q2. はどうなるのですか?
A2. で、1! = 1 になります。
A2. で、1! = 1 になります。
Q3. 再帰でなく反復(ループ)で書いた方が良いですか?
A3. 大きな を扱う場合はループの方がスタックを消費せず安全です。学習では再帰定義を理解することが重要です。
A3. 大きな を扱う場合はループの方がスタックを消費せず安全です。学習では再帰定義を理解することが重要です。
関連キーワード: 再帰、階乗、基底ケース、無限再帰、スタックオーバーフロー、尾再帰最適化、アルゴリズム、漸化式、関数定義、演算子の意味

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

