平成24年度 春期 午前 問8
アルゴリズム
再帰に関する問題
関数 gcd(m, n) が次のように定義されている。m=135,n=35 のとき,gcd(m, n) は何回呼ばれるか。ここで,最初の gcd (135, 35) の呼出しも,1 回に数えるものとする。また,m,n(m > n ≧ 0)は整数とし,m mod n は m を n で割った余りを返すものとする。
〔関数の定義〕 gcd(m, n) = m (n = 0 のとき) gcd(m, n) = gcd(n, m mod n) (n > 0 のとき)
- ア2
- イ3
- ウ4
- エ5
答えと解説を見る
✓ これが正解ウ4
解説
呼出しは四回で、最後の一回も数えます。
再帰の呼出し回数は、頭の中で足さずに一行ずつ書き出すのが確実です。最初の呼出しでは、百三十五を三十五で割った余りが三十になりますので、三十五と三十を引数として次が呼ばれます。次は三十五を三十で割った余りが五ですから、三十と五で呼ばれます。その次は三十を五で割った余りが零ですので、五と零で呼ばれます。最後の呼出しは、二つ目の引数が零のときの定義に当たり、一つ目の引数をそのまま返して終わります。書き出した行は四行ですので、呼出しは四回です。設問が最初の呼出しも一回に数えると断っているとおり、両端の数え方がこの問の要点になります。返ってきた値は二つの数に共通する最大の約数であり、この手続きがその値を求める形になっていることの確かめにもなります。
ほかの選択肢はなぜ違うのか
- ア2:余りを求める段を一つ飛ばして数えると、この値になります。与えられた二つの数から始めると、引数の組は三度移り変わり、三度目に移った先が終わりの回になります。
- イ3:二つ目の引数が零になった最後の呼出しを数えなかった場合の値です。その回も定義に従って呼ばれ、一つ目の引数を返すために実行されていますので、回数に含めます。
- エ5:値を返して終わったあとに、もう一度呼ばれると読んだ場合の値です。二つ目の引数が零のときは次を呼ばない定義になっていますので、そこで連鎖は止まります。
出典:平成24年度 春期 応用情報技術者試験 午前 問8
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)