問7 階乗の再帰的な定義

応用情報​技術者試験 令和7年度 春期 午前、全80問のうちの問7。

出典:令和7年度 春期 応用情報技術者試験 午前 問7

fact(n) は,非負の整数 n に対して n の階乗を返す。fact(n) の再帰的な定義はどれか。

  1. アif n=0 then return 0 else return n×fact(n−1)
  2. イif n=0 then return 0 else return n×fact(n+1)
  3. ウif n=0 then return 1 else return n×fact(n−1)
  4. エif n=0 then return 1 else return n×fact(n+1)
答えと解説を開く

正解はウです。

n の階乗は 1 から n までの積で、0 の階乗は 1 と決めます。すると n! = n × (n − 1)! と、1 つ小さい数の階乗を使って書けます。これを再帰で書くと、n が 0 のときは 1 を返し、それ以外は n × fact(n − 1) を返す形になります。たとえば fact(3) は 3 × fact(2) = 3 × 2 × fact(1) = 3 × 2 × 1 × fact(0) = 3 × 2 × 1 × 1 = 6 です。正解はウです。

ほかの選択肢が違う理由

  • アn が 0 のとき 0 を返すと、どの n でも最後に 0 を掛けることになり、結果が常に 0 になります。
  • イfact(n + 1) を呼ぶと引数が大きくなる一方で、n=0 に届きません。再帰が終わりません。また 0 を返す点も誤りです。
  • エ止まる条件で 1 を返すのは正しいですが、fact(n + 1) を呼ぶので引数が増え続け、再帰が終わりません。

仕組み

再帰は、関数が自分自身を呼び出す書き方です。必ず「これ以上呼ばずに答えを返す条件」(基底条件) を置き、呼ぶたびにその条件へ近づくように引数を変えます。

基底条件が無いか、引数が条件から遠ざかると、呼出しが積み重なり続けて、やがてスタックがあふれて止まります。

この問に出る言葉