本文へスキップ

技術士試験(情報工学部門)・情報技術者試験。ファーストマクロ。


Since 2016.4.19

平成27年度 技術士第一次試験問題【専門科目】

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となる。

V−12 目次 V−14