平成27年度 技術士第一次試験問題【専門科目】
【16】情報工学部門
V−13
下記の関数が準備された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│
 └─┴────┴────┴────┴────┘





【正解】 B
着眼点
(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のマクロのご相談なら ファーストマクロ 



V−12 目次 V−14
ファーストマクロ TOPページ