3.1 再帰の活用例

行って戻る

Yの字

Y の字を描く(ことから出発する)

  1. 行って戻ってくる(最初の姿勢に戻る)
      forward(100)
    分岐   right(20)
    枝1   (進んで、戻る)
    別方向へ   left(40)
    枝2   (進んで、戻る)
    元の方向を向く   right(20)
    戻る   back(100)
  2. Y字を描く(右図)
  3. これを関数にする。距離はパラメータ(引数)で与えることにする。
    再帰呼び出しされることを前提に、条件付きで中身を実行するように変更しておく。
  4. 行った先で、少し角度を変えてから、自分自身を、少し小さい値で呼び出す。
  5. 自分自身を2回(別の角度で)呼び出す。

     def y(len: Double) {
         if (len > 30) {
             forward(len)
             left(10)
             y(len * 0.9)
             right(20)
             y(len * 0.9)
             left(10)
             back(len)
         }
     }
     clear; y(100)
    

(たとえばこんな感じのコードになるだろう) 大筋 木のイメージ 木への一歩 角度の考え方 戻ってくる方法

8 の字を描く(ことをめざすから出発する) 円を一周

  1. 円を描く(正多角形でいいだろう)
  2. これを関数にする。一辺の長さはパラメータ(引数)で与えることにする。
    再帰呼び出しされることを前提に、条件付きで中身を実行するように変更しておく。
  3. 円を一周するループを、途中でいくつかに分割する
  4. その分割の切れ目で、自分自身を、少し小さい値で呼び出す。
    ここまでのプログラム例
    1. で分割せずに、条件式を作って、ある条件の時に呼び出すようにしてもいい
      repeat を forを使った構文に変える。 逆周り 条件式を使う

繰り返し方の変更
(ここまでの方法では、円の中に円が描かれることになる)

  1. 第2引数を設ける(例えば plusminus:Int のような)。 再帰呼び出しのときには -plusminus を渡す。最初の呼び出し時は 1 でいい。

  2. leftの呼び出し時の引数に plusminus を乗算して渡す (と、円を描く回転方向が呼び出しレベル毎に反転する)。 円の中に円 プログラム例

再帰のイメージ