2017-10-04 4 views
-1

再帰とカメのグラフィックを使用して図形を描く必要があります。タートルグラフィックス再帰

私はルーパーのほうが多く、めったに再帰を使用していないので、ここで役立つのはうれしいでしょう。どこから始めてもわからない。

形状は涼しく見えるだけです。任意のパラメータ化なし

+0

SEへようこそ、これまでに何を試みましたか? – jlandercy

+0

どこから始めたらいいのか分からないので、誰かが私を助けてくれるなら、始まりはすばらしいでしょう。 –

+0

http://www.kidscoderepo.com/python.htmlをご覧ください。あなたのクールな要求を満たすためには良いポイントです – jlandercy

答えて

0

は、ここでは初め:あなたは再帰関数を作成する場合

import time 
from turtle import * 

def recurse(n): 
    if n>0: 
     left(10) 
     forward(5) 
     recurse(n-1) 

recurse(20) 
time.sleep(5) 

、あなたは効果的にあなたのプログラムがいくつかの点で終了する保証を停止基準を持っている必要があります。

+0

あなたの答えをお寄せいただきありがとうございます。私は今、正しい道にいると思う。 –

+0

@RyanNacker、あなたの投票を投げて答えをマークすることを忘れないでください。あなたの投稿は他の人には有用でなければなりません。 – jlandercy

1

Oh man!どのような楽しい問題:)

あなたが自己宣言された 'ルーパー'として、私はあなたがループするように再帰について考えます。

ループでは、forループでは、forループ条件が満たされるまでループの本体を実行します。今、再帰は非常に似ています。関数のパラメータが再帰的なケースに当たらなくなるまで、関数を呼び出し続けます。彼らはベースケースにヒットし、代わりに再帰が構築できる値を返します。

このように再帰を考えて、正方形を描く方法を考えてみましょう。コードのどの部分が繰り返されるか(つまり、同じことをしようとしているループの本体に何があるか)を特定する必要があります。この繰り返しをいつ停止するかを特定します(ループが終了するタイミングはどうすればわかりますか)。

四角形を描いている間、私は少なくとも4回繰り返される2つの主要な事柄を考えることができます。カメは一定のステップ数だけ進み、カメは90度(向きによっては270度)になります。これは、再帰的なケースで詳しく説明します。

ここで、基本ケースについて考えてみましょう。まあ、正方形には4辺があることを知っています。そのため、カメが4辺を描いた後、それを止めたいと思っています。

最後に、関数宣言と、これらの2つの部分、再帰的ケースと基本ケースがどのように関係しているのかを考えてみましょう。関数の宣言は(Pythonで)以下の形態をとることができる。彼らはカメを有効にしてくださいどのように定義して、どこまでそれが必要徒歩」として

def draw_square_recursive(turn_deg=90, side_len, sides=4): 
    """ 
    Function draws a square with turtle graphics recursively 

    :param turn_deg: an int, the number of degrees a turtle should turn 
    :param side_len: an int, the length of a side of the square 
    :param sides: an int, the number of sides in our square 
    """ 

turn_degside_lenは、私たちの再帰的な場合のために重要となります。 sidesは興味深いパラメータであり、繰り返し続行するか停止するかを指定するために使用できます。 sidesから1を引くと、面を描くたびに、sides == 0の基底ケースが繰り返されるのを止める必要があることがわかります。

def draw_square_recursive(turn_deg=90, side_len, sides=4): 
    """ 
    Function draws a square with turtle graphics recursively 

    :param turn_deg: an int, the number of degrees a turtle should turn 
    :param side_len: an int, the length of a side of the square 
    :param sides: an int, the number of sides in our square 
    """ 
    if sides == 0: 
     # base case! 
    else: 
     # recursive case! 

この関数はdraw_square_recursiveの名前が、それができることに注意してください: 我々は再び再発する私たちの関数を呼び出すたびしたがって、我々のようにそれを呼び出します、draw_square_recursive(side_len, sides-1):

全体的に、関数の構造は次のようになります。他の形にもっと一般化することができます。どうやって見える?

ごめんなさい。P

+0

私はあなたのアプローチが好きです – jlandercy

0

もっと答えよりも社説が、このような再帰;それがお役に立てば幸いです。より良い反復として書かれ

def recurse(n): 
    if n>0: 
     left(10) 
     forward(5) 
     recurse(n-1) 

for n in range(2): 
    left(10) 
    forward(5) 

がどのように「と尋ねる人々に似ています再帰を使ってリスト内の要素の数を数えますか? "再帰を使用して正方形を描く同上。

私は再帰について学ぶことを理解していますが、迷子になるのは、再帰によって素晴らしいことが起こり、プログラムが遅くなる時間があるということです。

import sys 
from turtle import Turtle, Screen 

def hilbert_curve(n, turtle, angle=90): 
    if n <= 0: 
     return 

    turtle.left(angle) 
    hilbert_curve(n - 1, turtle, -angle) 
    turtle.forward(1) 
    turtle.right(angle) 
    hilbert_curve(n - 1, turtle, angle) 
    turtle.forward(1) 
    hilbert_curve(n - 1, turtle, angle) 
    turtle.right(angle) 
    turtle.forward(1) 
    hilbert_curve(n - 1, turtle, -angle) 
    turtle.left(angle) 

depth = int(sys.argv[1]) 
size = 2 ** depth 

screen = Screen() 
screen.setworldcoordinates(0, 0, size, size) 

yertle = Turtle('turtle') 
yertle.speed('fastest') 
yertle.penup() 
yertle.goto(0.5, 0.5) 
yertle.pendown() 

hilbert_curve(depth, yertle) 

yertle.hideturtle() 

screen.exitonclick() 

USAGE

% python3 hilbert.py 5 

(PARTIAL)OUTPUT

enter image description here

私が選んでいないよ:フラクタルは、再帰と不思議のように何かする機会です他の答え、私はあなたが大きなと思うことを示唆している(または少なくとも "クールに見える必要があります。」