平成29年度 春期 午前 問6
アルゴリズム
再帰に関する問題
関数 f(x, y) が次のとおり定義されているとき,f(775, 527) の値は幾らか。ここで,x mod y は x を y で割った余りを返す。
f(x, y): if y = 0 then return x else return f(y, x mod y)
- ア0
- イ31
- ウ248
- エ527
答えと解説を見る
✓ これが正解イ31
解説
割った余りを渡して呼び直すと、最大公約数が残ります。
この関数は、自分自身をもう一度呼び出す再帰の形で書かれています。二つ目の引数が〇になったとき、一つ目をそのまま返しました。〇でなければ、二つ目と、割った余りを渡して呼び直します。実際の値で追いかけます。七百七十五を五百二十七で割ると、余りは二百四十八でした。次は五百二十七を二百四十八で割り、余りは三十一になります。さらに二百四十八を三十一で割ると、割り切れました。そこで二つ目が〇になるので、一つ目の三十一が返ります。これはユークリッドの互除法そのもので、最大公約数を求めます。〇を挙げた肢は、最後の余りのほうを答えにした形でした。返るのは余りではなく、割られた側に残っていた数です。二百四十八は一回目の余りで、途中で通り過ぎた値でした。五百二十七は最初の引数のまま、一度も返っていません。
ほかの選択肢はなぜ違うのか
- ア0:〇は、最後に出た余りの値です。確かに割り切れた印ではありました。しかし返るのは一つ目の引数のほうです。二つ目が〇のとき、返すのは割られた側でした。見る場所を取り違えています。〇は終わりの合図です。戻る値が別のものでした。
- ウ248:二百四十八は、一回目の割り算で出た余りです。七百七十五を五百二十七で割った結果でした。そこから、あと二回の呼び出しが続きます。途中で止めてしまった形です。最後まで追うと三十一に行き着きました。止めるのが早すぎます。
- エ527:五百二十七は、最初に渡した二つ目の引数です。一度も返り値になっていません。呼び直すたびに、引数は小さくなっていきました。最後に残るのは、割り切れた一つ手前の数です。それが三十一でした。入口の値を答えにしています。
出典:平成29年度 春期 基本情報技術者試験 午前 問6
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)