回答
沒有任何參數化,這裏開始:
import time
from turtle import *
def recurse(n):
if n>0:
left(10)
forward(5)
recurse(n-1)
recurse(20)
time.sleep(5)
當您創建遞歸函數,你需要有一個停止標準,有效地保證被你的程序將退出在一些點。
謝謝大家的答案。我想我現在走在正確的軌道上。 –
@RyanNacker,別忘了投票並標記答案。您的帖子必須對其他人有用。 – jlandercy
噢!多麼有趣的問題:)
因爲你是一個自稱的'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_deg
和side_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
我喜歡你的方法 – jlandercy
更多的編輯比答案,但像這樣的遞歸:
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
(部分)輸出
我不欺負其他答案,我建議你認爲大(或至少超越「公正」需要看起來很酷「)
- 1. Python,Turtle Graphics,鍵綁定
- 2. Python Turtle Graphics - 將烏龜帶到前面
- 3. 從選項列表(Python Turtle Graphics)一次繪製多個形狀?
- 4. 如何使用turtle-graphics模塊同步動畫?
- 5. 如何破解Turtle Graphics Python中的無限循環
- 6. 方案列表(RECURSION)
- 7. Python:Tkinter&turtle
- 8. Python Turtle Speed
- 9. Python Turtle mainloop()用法
- 10. Javascript setTimeout-recursion不適用於Chrome和Firefox
- 11. Zelle Graphics動畫
- 12. Java(Button + Graphics)
- 13. Vaadin + GWT-Graphics
- 14. Turtle Gradient Color(評論代碼)
- 15. 爲什麼在運行「from turtle import *」之後不能打開Turtle屏幕?
- 16. CSS Set Graphics Not Clickable
- 17. Core Graphics drawing only only
- 18. protected void paintComponent(Graphics g)
- 19. iOS FloodFill:UIImage vs Core Graphics
- 20. Python Turtle按鍵事件不重複
- 21. Promo Graphics和Play Store中的Feature Graphics之間的區別
- 22. 使用Haskell Turtle的FilePath和readFile
- 23. Turtle繪製自己的圖形
- 24. Net Logo Turtle在補丁中消失
- 25. python turtle中的對象序列?
- 26. 如何在Python Turtle中導入圖像?
- 27. Python Turtle Draw隨機彩色圓圈
- 28. graphics setColor - 參數是什麼?
- 29. public void paintComponent(Graphics g)not working
- 30. intel hd graphics- framebuffer not complete?
歡迎來到SE,到目前爲止你有什麼嘗試? – jlandercy
我不確定從哪裏開始,所以如果有人能夠幫助我,其他人可以嘗試一開始就會很棒。 –
看看http://www.kidscoderepo.com/python.html,這是一個很好的開始,並滿足您的酷看要求 – jlandercy