見出し画像

APCSの例題解いてみる(4)

からの続きです。問題はこちら

https://apcs.csie.ntnu.edu.tw/wp-content/uploads/2022/10/%E8%A7%80%E5%BF%B5%E9%A1%8C_%E9%A1%8C%E5%9E%8B%E7%AF%84%E4%BE%8B.pdf

22.関数f1(),f2()が与えられている。f1()の中でf2()が、f2()の中でf1()が呼ばれている箇所がある。f1(1)の処理過程につき、間違っている選択肢はどれか?とりあえずどんな流れになるかを追ってみる
 f1(1)が実行されると条件式よりelse節が呼ばれ
     m表示・・1;f2(3);m表示・・1 が行われる。
 f2(3)が実行されると条件式よりelse節が呼ばれ
  n表示・・3;f1(2); n表示・・3が行われる
 f1(2)が実行されると条件式よりelse節が呼ばれ
  m表示2・・f2(4); m表示・・2 が行われる
 f2(4)が実行されると条件式よりn表示・・4が行われる
ということで、f2が呼ばれたのは2回。Cは間違い。

23.最大公約数の求め方・・中学一年のレベルの問題ではなかろう。ユークリッド互除法を知っていればすぐできる。知らなきゃ考えてる時間はない、という問題ですね。
 i=76 j=48、76÷48= 1あまり28、48÷28=1あまり20、28÷20=1あまり8
20÷8=2あまり4 8÷4=2あまり0 よって最大公約数は4という流れ
 i % j であまりをkに入れ、次はj%k だから、i=j , j=k という処理を繰り返す。あまりがゼロになったときのj を求める。この処理をしているのはA

24.コードの実行結果予想。foo barの二つの関数が与えられている。
 ・foo は引数が5以下なら foo:と書いてその引数を表示。そうでなければ引数から10引いた新たな引数でbarを呼ぶ
・barは引数が10以下ならbar:と書いてその引数を表示。そうでなければ引数から5引いてが新たな引数でfooを呼ぶ
 foo(15106) とか大きい引数が与えられて混乱させようとしているけど、要はfooの引数が5を超えていれば10引いてbar 。このbarの引数が10を超えていれば5を引いてfoo 引数mとすると
 m>5 かつ m-10>10 つまりm>20なら foo(m)=foo(m-15)
foo(15106)=foo(16)=bar(6)
bar(3091)=foo(3086)=foo(11)=bar(1)
foo(6693)=foo(18)=bar(8)
※条件押さえてゆっくり考えればできるけど時間限られていると焦りそう。

25.コード実行結果。いくつ数字が出力されるか。
f(22)・・22 
 nが1で無い間、奇数ならn=3n+1 偶数ならn =n/2 
変に一般化を考えずに、どんどん当てはめる方が早いか?
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1  最後1まで表示されることに注意。

26.コード実行結果。出力される数値
これもどんどん当てはめる。
count 10, 11, 12, 0, 14,15, あれー。はい、自分、初見で誤答でした。
count =14 は実行されないから・・
count 10, 11, 12, 0, 16 ですな。問題に書き込みしないで、コードにらんでいるだけじゃダメですな。if else の対応はしっかり把握しないと

27.6個の整数を入力して、最後の1個が6個の数字の中で最小かどうかを調べようとしたコード。でもバグがある。バグが検出できるようなデータセットはどれか。
 コード見てみると、データセットのfor文でもi =1 から5までデータをとる。最後の値をvalにセット。比較してallBigにTRUE FALSEを設定。
 バグはここ。一個でもd[i]>val で無いものがあればFALSEにしないといけないが、このコードではTRUEで上書きしてしまう可能性がある。
 つまり、一度は末尾の数字より小さい数字が出てきて、Falseが設定されながら、そのあとTRUEで上書きしてしまう、という選択肢を探す。
(A)は末尾の数字が最小で実際TRUEだからバグがみつけられない。
(B)11,12,13,14ではFALSEだが25でTRUE上書きしてしまう。これ。
(C)11でFALSEが書き込まれるがTRUEでの上書きは無い。
(D)15でFALSEが書き込まれるがTRUEでの上書きは無い。

28.階乗を求める再帰のコードだがバグあり。
 具体的な数字を入れてみるか。 n=2と置くと
f(2)= 2*f(1) , f(1)=1*f(0), f(0)=0*f(-1) で全部ゼロになってしまう。
f(0)=0*f(-1) を実行させず f(0)=1にするため、3行目の
if(n>=0) をif(n>0)に変更する。


いいなと思ったら応援しよう!