2017-10-04 56 views
-1

我需要使用遞歸和烏龜圖形繪製形狀。Turtle Graphics with Recursion

我更喜歡循環,很少使用遞歸,所以這裏的一些幫助會很好。甚至不知道從哪裏開始。

形狀只是需要冷靜看。

+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

噢!多麼有趣的問題:)

因爲你是一個自稱的'looper',我會考慮遞歸,就像循環一樣。

for循環中,執行循環體直到滿足for循環條件。現在,遞歸非常相似。您繼續調用該函數,直到該函數的參數不再遇到遞歸情況。他們碰到了一個基本情況,然後返回一個遞歸值可以建立起來的值。

因此,想想這種遞歸方式,我們來考慮如何繪製一個正方形。您需要首先確定代碼的哪些部分會重複出現(即for循環的主體會嘗試執行相同的操作)。然後,確定何時要停止這種重複(即如何知道for循環何時退出)。

畫一個正方形時,我可以想到兩個重要的事情,至少重複四次。烏龜前進一定數量的步驟,烏龜轉向90度(或取決於方向270度)。因此,這將是我們在遞歸情況下的細節。

現在,我們來考慮基本情況。嗯,我們知道一個正方形有四條邊,所以在烏龜畫四條邊後,我們希望它停止。最後,讓我們考慮一下函數聲明以及這兩部分(遞歸情況和基本情況)是如何進行的。一個函數的聲明可以採取以下形式(在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這個基本情況下我們需要停止循環! 因此,每當我們調用函數再次重演,我們將稱其爲,draw_square_recursive(side_len, sides-1):

總體而言,功能的結構會是什麼樣子:

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卻能更廣泛地應用於其他形狀。你看到了嗎?

對不起,如果這是一個漫長的囉嗦答案!希望它能幫助,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() 

用法

% python3 hilbert.py 5 

(部分)輸出

enter image description here

我不欺負其他答案,我建議你認爲大(或至少超越「公正」需要看起來很酷「)