令和7年度 春期 午前 問7
基礎理論
fact(n)の再帰的な定義
fact(n) は,非負の整数 n に対して n の階乗を返す。fact(n) の再帰的な定義はどれか。
- アif n=0 then return 0 else return n×fact(n−1)
- イif n=0 then return 0 else return n×fact(n+1)
- ウif n=0 then return 1 else return n×fact(n−1)
- エif n=0 then return 1 else return n×fact(n+1)
答えと解説を見る
✓ これが正解ウif n=0 then return 1 else return n×fact(n−1)
解説
0の階乗は1、n≧1では n×fact(n−1) と定義します。
階乗は、0 の階乗を 1 と定め、それ以上の n の階乗は n から 1 まで順に掛け合わせた値と定義される関数です。再帰で書き表すときは、この 0 のときの値を停止のための基底とし、それ以外のときは自分自身をより小さな引数で呼び出して、その戻り値に n を掛ける形に整えます。基底の返す値を誤って 0 にすると、n≧1 の階乗もすべて 0 になってしまうので、基底は必ず 1 を返す必要があります。また、より小さな引数で呼び出す部分は fact(n−1) でなければ、引数が減っていかず基底に届かないので再帰が終わりません。正解の肢はこの二点、基底で 1 を返すことと、引数を 1 減らして自分を呼ぶことの両方を満たしています。
ほかの選択肢はなぜ違うのか
- アif n=0 then return 0…:if n=0 then return 0 else return n×fact(n−1) と定義する肢は、基底で 1 ではなく 0 を返しています。この定義では n≧1 の階乗もすべて 0 になり、階乗の値になりません。
- イif n=0 then return 0…:if n=0 then return 0 else return n×fact(n+1) と定義する肢は、基底で 0 を返すうえに、呼び出し側でも引数を減らさず増やしています。基底に届かないので再帰そのものが終わりません。
- エif n=0 then return 1…:if n=0 then return 1 else return n×fact(n+1) と定義する肢は、基底の値は正しいものの、呼び出し側で引数を大きくしていく形になっています。引数が基底に届かないので、この再帰は終わりません。
出典:令和7年度 春期 応用情報技術者試験 午前 問7
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)