2016-04-15 9 views
1

を理解することができませんこれは私の最初の質問です、私はあなたの一部が答えに時間を見つけることを願っています。この再帰的な亀のpythonコード

私の目標は、ピタゴラスの木をコードするために、カメのモジュールを使用してpythonスクリプトを書くことです。

私は何日も過ごしましたが、本当にある時点を過ぎて進まなかったので、私はオンラインで自分を助けました。私は、私が欲しいものを行うコードを見つけましたが、コードの非常に少ない線できました:

import turtle 
t = turtle.Pen() 




LIMIT =11 
SCALAR = 0.5 * (2 ** 0.5) 


def drawTree(size, depth): 

    drawSquare(size) 

    if depth + 1 <= LIMIT: 

     t.left(90) 
     t.forward(size) 
     t.right(45) 
     drawTree(size * SCALAR, depth + 1) 

     t.forward(size * SCALAR) 
     t.right(90) 
     drawTree(size * SCALAR, depth + 1) 

     t.left(90) 
     t.backward(size * SCALAR) 
     t.left(45) 
     t.backward(size) 
     t.right(90) 



def drawSquare(sideLength): 

    for i in range(4): 
     t.forward(sideLength) 
     t.left(90) 



t.up(); t.goto(-100, -200); t.down() 
drawTree(170.0, 0) 

は、だから私は、第二および「IF」の第三段落を除いて、ほとんどのコードを理解する:なぜ彼らはありませんこれまで実行される?関数がそれ自身を繰り返し続けていると、その点は決して正常に到達しません! 私は本当にここで簡単に何かが欠けていると確信しています。私はあなたの質問を理解していただきたいと思います:)もう一度ありがとう!

+0

。最初の 'drawTree'関数の深度は0なので' if'文は真で、 'drawTree'は' 1'の深さで呼び出されます。これは 'drawTree'が終わるまで真実です深さ '11 'で呼び出され、' if'文が偽であり、 'drawTree'への呼び出しがなくなり、深さ' 10'で前方に 't.forward ...' –

+0

しかし、深さが11の場合、if文が偽になると、関数を完全に終了してはいけませんか?とにかくあなたの入力に感謝します! – zeldamia

+0

サイモンが言ったこと。 'drawTree'は自分自身を永遠に呼び出すことはないので、最終的に再帰呼び出し_do_の後の文が実行されます。深度== LIMITの再帰呼び出しが戻ると、制御は前の呼び出しに戻ります。深度== LIMIT-1です。あなたは、 'if'の直下に' print( '' * depth、depth、size)という 'LIMIT = 4'(あるいは他の小さな値)でコードを実行しようとします。 –

答えて

0

drawTree関数は永遠に呼び出しを続けることはないので、最終的に再帰呼び出し後の文doが実行されます。 depthの再帰呼び出し== LIMITが返ってくると、制御は前の呼び出しに戻ります。ここで、depth == LIMIT-1です。

コードを少し修正したものですが、実行をトレースするためにprintコールがスローされています。

私はまた、いくつかの小さな変更を加えました。 SCALARの計算を簡略化しました。0.5 * sqrt(2) == sqrt(0.5)です。私はカメが実際に四角形を描いているときにペンを押し下げます。また、図面の完成時にウィンドウが開いたままになるようにturtle.mainloop()コールを追加しました。それはすべて `depth`変数についてです

from __future__ import print_function 
import turtle 

LIMIT = 3 
SCALAR = 0.5 ** 0.5 
INDENT = ' ' * 4 

def drawTree(size, depth, branch): 
    print(INDENT * depth, branch, depth, 'start') 

    drawSquare(size) 

    if depth + 1 <= LIMIT: 

     t.left(90) 
     t.forward(size) 
     t.right(45) 
     drawTree(size * SCALAR, depth + 1, 'left ') 

     t.forward(size * SCALAR) 
     t.right(90) 
     drawTree(size * SCALAR, depth + 1, 'right') 

     t.left(90) 
     t.backward(size * SCALAR) 
     t.left(45) 
     t.backward(size) 
     t.right(90) 

    print(INDENT * depth, branch, depth, 'stop') 


def drawSquare(sideLength): 
    t.down() 
    for i in range(4): 
     t.forward(sideLength) 
     t.left(90) 
    t.up() 


t = turtle.Pen() 
t.up() 
t.goto(-100, -200) 
drawTree(100.0, 0, 'root') 

turtle.mainloop() 

出力

root 0 start 
    left 1 start 
     left 2 start 
      left 3 start 
      left 3 stop 
      right 3 start 
      right 3 stop 
     left 2 stop 
     right 2 start 
      left 3 start 
      left 3 stop 
      right 3 start 
      right 3 stop 
     right 2 stop 
    left 1 stop 
    right 1 start 
     left 2 start 
      left 3 start 
      left 3 stop 
      right 3 start 
      right 3 stop 
     left 2 stop 
     right 2 start 
      left 3 start 
      left 3 stop 
      right 3 start 
      right 3 stop 
     right 2 stop 
    right 1 stop 
root 0 stop 
0

たとえば、「depth」は10で、プログラムは最初の段落でdrawTree(size * SCALAR、10 + 1)と呼ばれます。 "深さ"が11になり、IFが偽でプログラムがdrawTreeに戻ります。ここで "深さ"は10です。プログラムは次の行、2行目の1行目を実行します。

2番目の段落でdrawTree()というプログラムが呼び出されますが、「深さ」はLIMITに達していませんが、3番目の段落の最初の行に戻ります。