平成29年度 秋期 午前 問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)
解説
零の階乗は一、引数は一つ小さくするのが正しい形です。
設問は、非負の整数に対して階乗を返す関数の、再帰的な定義として正しいものを選ばせています。四つの記述は、引数が零のときに返す値と、次の呼び出しに渡す引数という二か所だけを入れ替えた組合せになっているので、この二点をそれぞれ決めれば残るのはひとつです。まず返す値です。零の階乗は一と定められています。ある数の階乗はその数と、一つ小さい数の階乗との積ですから、一の階乗が一になるためには零の階乗が一でなければつじつまが合いません。次に渡す引数です。再帰は止まる条件へ近づいていかなければならないので、呼び出しのたびに引数を一つ小さくする必要があります。両方を満たす記述を探します。
ほかの選択肢はなぜ違うのか
- アif n=0 then return 0…:渡す引数は一つずつ小さくなっていて正しいのですが、引数が零のときに零を返します。掛け算の連鎖が最後に零を掛けることになるため、どの入力でも答えが零になってしまいます。
- イif n=0 then return 0…:零のときに零を返すうえ、呼び出しのたびに引数が一つずつ大きくなります。終わりの条件から遠ざかり続けるので、値が返る前に呼び出しが積み上がって落ちてしまいます。
- エif n=0 then return 1…:零のときに返す値は正しいものの、呼び出しのたびに引数が増えていきます。終わりの条件に永久に届かないため、関数として答えを返すところまで行き着けません。
出典:平成29年度 秋期 応用情報技術者試験 午前 問7
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)