平成25年度 春期 午前 問6
基礎理論
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 を返し、引数を 1 減らす形です。
四つの式は、二つの点でしか違いません。一つは 0 を受け取ったときに返す値、もう一つは自分を呼び直すときの引数です。この二つを別々に決めれば、答えは一つに絞れます。まず返す値です。階乗の定義では 0 の階乗は 1 と決まっています。ここを 0 にすると掛け算の連鎖に 0 が混ざり、どの値を渡しても結果が 0 になってしまいます。次に引数です。再帰は、呼び出すたびに止まる条件へ近づくことで終わります。引数を増やす向きにすると 0 へ届かず、呼び出しが終わりません。二つを満たす式で 3 の階乗を計算すると、3 が 2 を呼び、2 が 1 を呼び、1 が 0 を呼んで 1 が返り、掛け戻して 6 が得られます。再帰の定義を見るときは、止まったときに正しい値を返すかと、止まる条件へ近づく向きかの二点を確かめます。
ほかの選択肢はなぜ違うのか
- アif n=0 then return 0…:止まる条件で 0 を返す形です。引数の向きのほうは正しいのですが、最後に 0 が掛かってしまうため、どんな値を渡しても答えが 0 になります。
- イif n=0 then return 0…:返す値も引数の向きも誤っています。呼び出すたびに引数が大きくなるので止まる条件に届かず、仮に届いたとしても 0 が掛かって答えが潰れます。
- エif n=0 then return 1…:止まる条件の値は正しいものの、呼び出すたびに引数が増えていきます。止まる条件から遠ざかる一方なので、呼び出しが積み上がり続けて終わりません。
出典:平成25年度 春期 応用情報技術者試験 午前 問6
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)