階乗の再帰定義はなぜ n × F(n−1) になるのか

広告

基本情報技術者試験では、再帰関数の考え方が問われることがあります。

今回の問題3-14は、再帰の中でも代表的な例である階乗を題材にした問題です。

「階乗」と聞くと難しく感じるかもしれませんが、ポイントは次の1つです。

nの階乗は、nに「1つ小さい階乗」を掛けたもの

つまり、

n! = n × (n - 1)!

です。

この形が分かると、答えが自然に見えてきます。

問題

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

n > 0 のとき、F(n) = a
n = 0 のとき、F(n) = 1

選択肢は次の通りです。

ア n + F(n - 1)
イ n - 1 + F(n)
ウ n × F(n - 1)
エ (n - 1) × F(n)

正解は、

ウ n × F(n - 1)

です。

階乗とは何か

階乗とは、ある整数から1までを順に掛けていく計算です。

例えば、5の階乗は次のようになります。

5! = 5 × 4 × 3 × 2 × 1

つまり、

5! = 120

です。

4の階乗なら、

4! = 4 × 3 × 2 × 1

なので、

4! = 24

です。

5! は 5 × 4! と考えられる

ここで重要なのは、5! を次のように分解できることです。

5! = 5 × 4 × 3 × 2 × 1

このうち、

4 × 3 × 2 × 1

の部分は、4! です。

つまり、

5! = 5 × 4!

と書けます。

同じように、

4! = 4 × 3!
3! = 3 × 2!
2! = 2 × 1!
1! = 1 × 0!

と考えることができます。

これを一般化すると、

n! = n × (n - 1)!

になります。

F(n) は n! を表している

この問題では、階乗を計算する関数を F(n) としています。

つまり、

F(5) は 5!
F(4) は 4!
F(3) は 3!

を表します。

先ほどの考え方を F(n) で書くと、

F(n) = n × F(n - 1)

になります。

したがって、aに入る式は、

n × F(n - 1)

です。

よって正解は、

です。

実際に F(4) で確認する

F(4) を考えてみましょう。

問題の定義に従うと、

F(4) = 4 × F(3)

です。

次に F(3) は、

F(3) = 3 × F(2)

です。

さらに、

F(2) = 2 × F(1)
F(1) = 1 × F(0)

となります。

ここで問題文には、

n = 0 のとき、F(n) = 1

とあります。

つまり、

F(0) = 1

です。

これを戻していくと、

F(1) = 1 × 1 = 1
F(2) = 2 × 1 = 2
F(3) = 3 × 2 = 6
F(4) = 4 × 6 = 24

となります。

つまり、

F(4) = 4 × 3 × 2 × 1 = 24

となり、正しく4の階乗が計算できています。

なぜ F(0) = 1 なのか

初学者が疑問に感じやすいのが、

0! = 1

という部分です。

「0個を掛けるのになぜ1なのか」と感じるかもしれません。

ここでは、まず試験対策としては、

0! は 1 と定義されている

と覚えておけば大丈夫です。

再帰関数では、このような計算を止めるための条件が必要です。

もし F(0) = 1 がなければ、

F(4)
→ F(3)
→ F(2)
→ F(1)
→ F(0)
→ F(-1)
→ F(-2)

のように、いつまでも関数を呼び続けてしまいます。

そのため、

n = 0 になったら 1 を返して終わる

というルールが必要です。

これを終了条件といいます。

再帰は「1回分だけ考える」

再帰関数を理解するときは、すべてを一気に追いかけようとすると混乱します。

大事なのは、

今の n で何をするか

だけを見ることです。

階乗の場合、F(n) がやることは次の1つです。

n に、1つ小さい階乗 F(n - 1) を掛ける

つまり、

F(n) = n × F(n - 1)

です。

F(n – 1) の中身まで一気に考えすぎると、再帰は難しく見えます。

まずは、

F(n - 1) は、ひとまず「1つ小さい階乗を計算してくれるもの」

と考えるのがコツです。

選択肢を確認する

ア n + F(n – 1)

これは掛け算ではなく足し算です。

階乗は、

5 × 4 × 3 × 2 × 1

のように掛け算で計算します。

そのため、

n + F(n - 1)

では階乗になりません。

よってアは誤りです。

イ n – 1 + F(n)

これは F(n) の中で、また F(n) を使っています。

つまり、

F(n) = n - 1 + F(n)

のような形になります。

これでは同じ F(n) を呼び続けてしまい、計算が前に進みません。

再帰では、通常、

F(n - 1)

のように、少し小さい問題にしていく必要があります。

よってイは誤りです。

ウ n × F(n – 1)

これは、

n! = n × (n - 1)!

という階乗の考え方そのものです。

F(n – 1) は、1つ小さい階乗を表します。

そのため、

F(n) = n × F(n - 1)

で正しく階乗を表せます。

よってウが正解です。

エ (n – 1) × F(n)

これは F(n) の中で、また F(n) を使っています。

F(n) = (n - 1) × F(n)

となるため、これも計算が前に進みません。

また、本来は n を掛ける必要があります。

n × F(n - 1)

でなければなりません。

よってエは誤りです。

この問題のポイント

この問題で見るべきポイントは、次の3つです。

1. 階乗は掛け算である
2. n! は n × (n - 1)! と分解できる
3. 再帰では、F(n) ではなく F(n - 1) のように小さい問題へ進める

したがって、

F(n) = n × F(n - 1)

となります。

まとめ

問題3-14は、階乗の再帰定義を問う問題です。

階乗は、

5! = 5 × 4 × 3 × 2 × 1

のように、1まで順に掛けていく計算です。

そして、

5! = 5 × 4!

と考えることができます。

これを一般化すると、

n! = n × (n - 1)!

です。

問題では階乗を F(n) と表しているので、

F(n) = n × F(n - 1)

となります。

よって、正解は、

ウ n × F(n - 1)

です。

再帰の問題では、まず

1回分の処理は何か
どこで止まるのか
小さい問題に進んでいるか

を見ると、選択肢を判断しやすくなります。

訪問数 1 回, 今日の訪問数 1回

広告