下記の関数が準備されたC言語で、引数nが100のときに
下図のコッホ曲線を描画する koch を作成する場合、 ア 〜 エ に
入る値の組合せとして最も適切なものはどれか。
ただし、スタート時点における向きは水平右向きになっていると仮定する。
void forward(int length)
画面上の点が現在の向きに長さlengthだけ移動し、
軌跡を描く。lengthが負のときは後ろ向きに移動する。
void left(int angle)
現在の向きを左向きにangleの角度だけ回転する。
angleが負のときは右向きに回転する。
void koch(int n) {
if (n > ア ){
n = (int)(n / 3);
koch(n); left( イ ); koch(n); left( ウ ); koch(n); left( エ ); koch(n);
} else {
foward(n);
}
}
┌─┬────┬────┬────┬────┐
│ │ ア │ イ │ ウ │ エ │
├─┼────┼────┼────┼────┤
│@│ 1│ 60│−120│ 60│
├─┼────┼────┼────┼────┤
│A│ 4│ 120│ −60│ 120│
├─┼────┼────┼────┼────┤
│B│ 7│ 60│−120│ 60│
├─┼────┼────┼────┼────┤
│C│ 10│ 120│ −60│ 120│
├─┼────┼────┼────┼────┤
│D│ 13│ 60│−120│ 60│
└─┴────┴────┴────┴────┘
着眼点
(1) n=100であるから、koch()の
n = (int)(n / 3); によって
nの値は 33、11、3、1と変ってゆく。
(2)1度koch()を呼び出されたとき、
koch(); left; koch(); left; koch(); left; によって4本分の
軌跡 _/\_ を描く準備をするか、
foward() によって長さがnの線を1本引くことになる。
(3) 4本分のコッホ曲線に着目すると、
60°→ −120° → 60°と向きを変えている。
・着眼点の(3)から選択肢は@BDのいずれかに絞られる。
・次に_/\_が何セットあるか数えると、16セットであることが判る。
これは、(2)より、koch()関数はn=100を基軸に考えると
以下の様に再帰的に呼び出されていることになる。
100
33
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
33
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
33
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
33
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
11 → 3,3,3,3 として1セット描画
これは、if(n > ア) のところで、アは 3と10の間の数字でなければならない。
従って選択肢はBとなる。
EXCELのマクロのご相談なら ファーストマクロ へ