タートルグラフィックスで再帰についてみてみよう

再帰というのは、関数内で同じ関数を実行する事を指します。

再帰を使う事で複雑な処理を行う事ができるようになります。


タートルグラフィックスで関数の引数について見てみようで作成したコードを再帰用に書き換えてみます。


前に作成したコードの内、関数のコードは

def forward_turn_left(distance):
␣␣␣␣forward(distance)
␣␣␣␣left(90)

※␣は半角スペース1個分

になります。


この関数内で、少しだけ移動距離を小さくして同じ関数を実行するようにしてみます。

def forward_turn_left(distance):
␣␣␣␣if distance < 10:
␣␣␣␣␣␣␣␣return
␣␣␣␣forward(distance)
␣␣␣␣left(90)
␣␣␣␣
␣␣␣␣distance -= 5
␣␣␣␣forward_turn_left(distance)

※␣は半角スペース1個分

最後の行で同じ関数を実行しています。


再帰のコードを書く上で重要になりますのが、関数名の下の行にあります

if distance < 10:
␣␣␣␣return

※␣は半角スペース1個分

が重要になります。

関数内で return を通過すると関数の実行が終了します。


何度も関数が実行されてしまいますので、何処かのタイミングで強制的に関数を終了する仕組みを用意しておく必要があり、今回はdistance(距離)の数字で終了の判定を行います。




作成しました再帰のコードを使ってみます。

from turtle import *


def forward_turn_left(distance):
␣␣␣␣if distance < 10:
␣␣␣␣␣␣␣␣return
␣␣␣␣forward(distance)
␣␣␣␣left(90)
␣␣␣␣
␣␣␣␣distance -= 5
␣␣␣␣forward_turn_left(distance)


shape("turtle")
forward_turn_left(300)
done()

※␣は半角スペース1個分


上記のコードを実行してみますと、

のような実行結果になりました。


サンプル

下記のコードを写して実行してみよう。

from turtle import *


def branch(step):
    if step < 10.0:
        return
    left(20)
    pendown()
    forward(step)
    penup()
    branch(step * 0.6)
    back(step)
    right(20)

    right(10)
    pendown()
    forward(step)
    penup()
    branch(step * 0.7)
    back(step)
    left(10)


left(90)
penup()
back(300)
pendown()
forward(200)
branch(150)
done()
マインクラフト用ビジュアルエディタを開発しています。
詳しくはinunosinsi/mcws_blockly - githubをご覧ください。