2

次のような単純な再帰を理解できます。

def count(n):
    if n <= 0:
        return
    else:
        print n
        count(n-1)

count(3)

ただし、Koch Snowflake の実装など、より複雑なコードに直面した場合:

def koch(order, size):
    if order == 0:
            t.forward(size)
    else:
            koch(order-1, size/3)
            t.left(60)
            koch(order-1, size/3)
            t.right(120)
            koch(order-1, size/3)
            t.left(60)
            koch(order-1, size/3)

koch(1, 100)

混乱します。これらの複数の再帰関数呼び出しに従う方法がわかりません。

4

6 に答える 6

2

実行パスを頭の中で詳細にイメージすることは、誰にとっても特に簡単なことではないと思います。ノードが個々の再帰呼び出しを表すツリーを描くことは、紙の上で視覚化するための良い方法です。各ノードがバブルの場合、変数の状態に関する情報などを入れることができます。複数の再帰呼び出しがある状況では、各ノードの下にタイムラインを表す複数のツリーがあります。

于 2013-07-19T11:41:54.077 に答える
2

あなたの Koch スノーフレークの例は良い例です。スノーフレークは何で構成されていますか? 最初の反復 ( order == 0) では、単純な行として開始されます。これがベースケースです。

________

ここで、再帰の次のレベル ( order == 1) では、その基本ケースが反転した を形成する 4 つのサブラインに分割されVます。これを実現するVには、互いに適切な角度で 4 つの線を作成する必要があります (これにはt.left(60)および 同様のコマンドが必要です)。

これらの各行は、(それ自体で) 基本ケースのインスタンスです。ちょうど3倍小さいです。それが に表示されkoch(order-1, size/3)ます。

   /\
__/  \__

次のレベルの再帰を想像してみてください。各行は再び 4 つのサブ行に分割されます。その模様は続く…

于 2013-07-19T11:48:17.620 に答える
1

次の行に沿って何かを試してください:

def koch(order, size):
    print 'koch(', order, size, ')'
    if order == 0:
            t.forward(size)
            print 'Got to the bottom of it'
    else:
            koch(order-1, size/3)
            t.left(60)
            koch(order-1, size/3)
            t.right(120)
            koch(order-1, size/3)
            t.left(60)
            koch(order-1, size/3)

koch(1, 10)

そして、最終的にチェーンの一番下に到達するまで、各呼び出しがどのように koch を呼び出すかを確認する必要があります。

于 2013-07-19T11:43:46.073 に答える
1

Python Tutor Web サイトは、プログラム フローの視覚化に役立ち ます http://www.pythontutor.com/

于 2013-07-19T12:09:18.740 に答える
0

コードを理解するには、koch スノーフレークを作成する最初の手順を確認すると役立ちます。すべての再帰ステップで三角形があり、コードは別のものをオーバーレイします。これで、コードが呼び出される新しい三角形ができました。すべてが最初から始まります。

于 2013-07-19T11:45:14.393 に答える