基本情報技術者 2011年 春期 午前(科目A) 問06
問題文
関数が次のように定義されているとき、の値は幾らか。ここで、はをで割った余りを返す。
: if then return else return
選択肢
ア:0
イ:31(正解)
ウ:248
エ:527
🔒 解説は解答すると表示されます
ユークリッドの互除法【午前解説】
正解の理由
関数
は「もし なら を返す、さもなければ を返す」という定義であり、これはユークリッドの互除法と同一です。与えられた値について計算を進めると最終的に となり、定義により が返ってきます。したがって正解は イ(31)です。
解法ステップ
- 与えられた定義をユークリッドの互除法と同一であると認識する。
- 実際に値を代入して再帰の流れを追う:
- → 、まず 。
- 次に → 、。
- 次に → 、。
- 最後に となり定義より を返す。
- よって が導かれる。
選択肢別の誤答解説
- ア: 0 — 余りが0になった場面を「答えは0」と誤解した場合の落とし穴。定義では のとき を返すため誤り。
- イ: 31 — 正解。ユークリッド互除法の結果、最大公約数は31となる。
- ウ: 248 — 途中の余りをそのまま答えにしてしまったパターン。248は途中の余りだが最終結果ではない。
- エ: 527 — 片方の引数を単純に答えと見なした誤り。最終的に返る値は両数の最大公約数であり527ではない。
よくある誤解
- 「余りが0になったら0を返す」と考える誤り:実際は余りが0の直前の呼び出しでの第一引数 が返され、これが最大公約数です。
- 「再帰を途中で止めて現在の余りを答えにしてしまう」:途中の余り(例えば248)ではなく、最終的に になったときの を答える点を見落としやすい。
- 「関数は単純な mod を返すだけ」と混同:この関数は再帰呼び出しを通じて最大公約数を求めるアルゴリズムです。
補足コラム
この関数は標準的なユークリッドの互除法で、任意の非負整数 に対して を計算します。計算量はおおよそ入力の桁数に対して対数オーダーで、最悪ケースはフィボナッチ数列に近い入力で発生します。拡張ユークリッド互除法を用いると、最大公約数とともに係数 を求めて線形方程式の解や逆元計算に使えます。
簡単な実装例(参考):
def f(x, y):
if y == 0:
return x
return f(y, x % y)
print(f(775, 527)) # 31
FAQ
Q1: なぜ は常に最大公約数を返すのですか?
A1: ユークリッドの互除法は「」という性質に基づき、再帰的に余りを取ることで最終的に を求めます。
A1: ユークリッドの互除法は「」という性質に基づき、再帰的に余りを取ることで最終的に を求めます。
Q2: 引数の順序を入れ替えても結果は同じですか?
A2: はい。 なので順序に依らず同じ最大公約数が得られます。
A2: はい。 なので順序に依らず同じ最大公約数が得られます。
Q3: 負の数や0が含まれる場合は?
A3: 定義を非負整数に限定することが一般的です。片方が0の場合はもう片方を返すので と扱います。
A3: 定義を非負整数に限定することが一般的です。片方が0の場合はもう片方を返すので と扱います。
関連キーワード: ユークリッド互除法、最大公約数、再帰関数、GCD、アルゴリズム、演習問題

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

