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

ア in n = 0 then return 0 else return n * fact(n-1)
イ in n = 0 then return 0 else return n * fact(n+1)
ウ in n = 0 then return 1 else return n * fact(n-1)
エ in n = 0 then return 1 else return n * fact(n+1)


正解 ウ


解説

nの階乗とは、1からnまでの数を掛け算します。
ただし、0の階乗は1とします。
3の階乗
3 * 2 * 1 = 6
6の階乗
6 * 5 * 4 * 3 * 2 * 1 = 720

まず、nから1までの掛け算をする関数と考えると、「fact(n+1)」としている選択肢イエは除外できます。
選択肢イエをn=3で実行すると、「fact(n+1)」の部分が「fact(3+1)」「fact(4+1)」とどんどん数字が増えていき、永遠に計算が終わりません。

次に、0の階乗を1とする原則から考えて、「if n = 0 then return 0」としている選択肢アイは不正解です。
また、選択肢アをn=1で実行すると「fact(1 - 1)」の結果が「return 0」で 0 になるため、以下のようにすべての計算結果が 0 になってしまい、nの階乗を求められないため、選択肢アも不正解となります。

例 選択肢ア n=3の場合
fact(3)

if n = 0 then return 0 else return 3 * fact(3 - 1) ※n=2で再起呼び出し

if n = 0 then return 0 else return 2 * fact(2 - 1) ※n=1で再起呼び出し

if n = 0 then return 0 else return 1 * fact(1 - 1) ※n=0で再起呼び出し

if n = 0 then return 0 else return 0 * fact(0 - 1) ※n=0のため、「return 0」

選択肢アでは最終的に、「3 * 2 * 1 * 0 = 0」となってしまうため、不正解です。
選択肢ウの場合は「3 * 2 * 1 * 1 = 6」となります。