関数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)
正答2
解説
正解は2です。
再帰的に定義された関数の値をたどる問題です。
この関数は、yが0ならxを返し、そうでなければ (y, x mod y) で自分自身を呼び出します。
これはユークリッドの互除法で、2数の最大公約数を求めます。
【計算】
f(775, 527) では 775 mod 527=248 なので、f(527, 248) を呼びます。
f(527, 248) では 527 mod 248=31 なので、f(248, 31) を呼びます。
f(248, 31) では 248 mod 31=0 なので、f(31, 0) を呼びます。
f(31, 0) は y=0 なので 31 を返します。
【選択肢別解説】
1:× 0は最後の呼出しでyに入る値です。
関数が返すのはそのときのxである31です。
2:○ 上の計算のとおり、f(775, 527) は31を返します。
31は775(31×25)と527(31×17)の最大公約数です。
3:× 248は最初の剰余であり、途中の値にすぎません。
4:× 527は最初の引数yであり、関数の戻り値ではありません。
【ポイント】
「f(y, x mod y) を繰り返し、y=0でxを返す」形は、ユークリッドの互除法と覚えておくと即答できます。