我試圖讓方塊看起來像:

但我的代碼卻在畫:
我不知道我做錯了什么,或者我的整個方法是錯誤的。
下面是代碼:
import turtle as tt
def recurse(depth, size)。
if depth==0:
通過: 通過.
else:
if depth%2==0:
tt.pencolor('blue')
else:
tt.color('orange')
tt.fd(size)
tt.left(90)
tt.fd(size)
tt.left(90)
tt.fd(size)
tt.left(90)
tt.fd(size)
tt.left(90)
tt.fd(size)
tt.left(90)
tt.fd(size)
tt.right(90)
recurse(depth - 1, size / 3)
tt.penup()
tt.bk(size)
tt.pendown()
recurse(depth-1,size/3)
tt.penup()
tt.left(90)
tt.back(size)
tt.right(90)
tt.back(size)
tt.pendown()
recurse( 4, 100 )
tt.done()
在右上角,小方塊的大小最終并不正確,而在左邊,烏龜向前移動的幅度太大。
我如何寫遞回以產生正確的左上角方塊?
uj5u.com熱心網友回復:
不錯的嘗試! 我將建議一個稍有不同的方法,為你的方形繪制函式添加x和y坐標,并使用t.goto(x, y)來重新定位烏龜。這些坐標代表了正方形應該被繪制的左下角,并且省去了你用手洗掉烏龜的麻煩(盡管技術上是可行的,但它不太干凈)。
在繪制完一個方塊后,烏龜將始終朝向右邊,并準備好繪制下一個方塊,所以移動命令被保持在最低限度。剩下的就是計算出每個角的原點坐標。
對于右上角,這很簡單:x size, y size。對于左上角,它是類似的:仍然是y size,但使用x - size_of_smaller_square來偏移x軸的正確數量。如果你感到好奇,我還包括了左下角和右下角。
import turtle as t
def draw_square(depth, size, x=0, y=0, shrink_by=3)。)
if depth <= 0:
return
t.penup()
t.goto(x, y)
t.color(("blue", "orange") [depth%2]
t.pendown()
for _ in range(4)。
t.forward(size)
t.left(90)
smaller_size = size / shrink_by
draw_square(depth - 1, smaller_size, x size, y size)
draw_square(depth - 1, smaller_size, x - smaller_size, y size)
#draw_square(depth - 1, smaller_size, x - smaller_size, y - smaller_size)/span>。
#draw_square(depth - 1, smaller_size, x size, y - smaller_size)
if __name__ == "__main__"/span>:
t.speed("最快")
draw_square(depth=4, size=100)
t.exitonclick()
你提到
goto被禁止。你可以遵循一個保證有效的機械策略:在每次遞回呼叫結束時,總是把烏龜完全放回它開始的地方(相同的位置和方向)。這尊重了遞回的自相似結構。每一幀的高級方法是:
畫出當前的盒子
對于每個子框:
對于每個子框:
- 將烏龜移動到正確的位置和方向,以繪制子盒 。
- 產生一個遞回呼叫 。
- 執行你在第3步中所做的所有動作 。
下面是這個策略的一個正確但冗長而草率的實作:
import turtle as t
def draw_square(depth, size, shrink_by=3)。
if depth <= 0:
# 繪制這個盒子: return.
t.color(("blue", "orange")[depth%2]
t.pendown()
for _ in range(4)。
t.forward(size)
t.left(90)
t.penup()
smaller_size = size / shrink_by
# 把烏龜放在右上角,面向東方,并產生一個孩子。
t.forward(size)
t.left(90)
t.向前(size)
t.right(90)
draw_square(depth - 1, smaller_size)
# 撤銷移動。
t.right(90)
t.forward(size)
t.left(90)
t.向后(size)
# 把烏龜放在左上角,面向東方,并產生一個孩子。
t.left(90)
t.forward(size)
t.right(90)
t.向后( smaller_size)
draw_square(depth - 1, smaller_size)
# 撤銷移動。
t.forward(smaller_size)
t.right(90)
t.forward(size)
t.left(90)
if __name__ == "__main__"/span>:
t.speed("最快")
draw_square(depth=4, size=100)
t.exitonclick()
雖然這個方法可行,但你可以看到有一些多余的動作可以被消除,同時仍然保留了一個屬性,即烏龜將總是在遞回函式開始時的相同位置和方向結束。重寫:
import turtle as t
def draw_square(depth, size, shrink_by=3)。
if depth <= 0:
# 繪制這個盒子: return.
t.color(("blue", "orange")[depth%2]
t.pendown()
for _ in range(4)。
t.forward(size)
t.left(90)
t.penup()
smaller_size = size / shrink_by
# top-right[/span]。
t.forward(size)
t.left(90)
t.forward(size)
t.right(90)
draw_square(depth - 1, smaller_size)
# top-left[/span]。
t.backward(size smaller_size)
draw_square(depth - 1, smaller_size)
# 撤銷所有的移動以重置烏龜的狀態。
t.forward(smaller_size)
t.right(90)
t.forward(size)
t.left(90)
if __name__ == "__main__"/span>:
t.speed("最快")
draw_square(depth=4, size=100)
t.exitonclick()
通過嘗試尋找模式并將其轉化為回圈,可以使這一程序更加簡潔;例如,如果你不介意在繪制父方框的程序中繪制子方,你可以跳過中間的動作。這段代碼繪制了所有的4個角,但是你可以嘗試將它改編為只繪制頂部的2個角:
import turtle as t
def draw_square(depth, size, shrink_by=3)。
if depth <= 0:
return 深度<= 0: return
for _ in range(4)。
t.color(("blue", "orange")[depth%2]
t.forward(size)
t.right(90)
draw_square(depth - 1, size / shrink_by)
t.right(180)
if __name__ == "__main__"/span>:
t.speed("最快")
t.pendown()
draw_square(depth=4, size=100)
t.exitonclick()
uj5u.com熱心網友回復:
你不允許使用goto(),但你是否允許使用stamp()?
我對@ggorlen ( 1)的優秀最終解決方案進行了重做,它使用了stamping而不是drawing,也沒有使用goto:
import turtle
COLORS = ['blue', 'orange']
CURSOR_SIZE = 20]
def draw_square(depth, size, shrink_by=3)。
if深度。
turtle.pencolor(COLORS[depth % len(COLORS)] )
turtle.shapesize(size / CURSOR_SIZE)
turtle.stamp()
offset = (size (shrinkage := size / shrink_by)) * 2**0.5 / 2
for _ in range(4)。
turtle.right(45)
turtle.forward(offset)
turtle.left(45)
draw_square(depth - 1, shrinkage)
turtle.right(45)
turtle.backward(offset)
turtle.left(135) # 撤銷右角和前進角。
if __name__ == "__main__"/span>:
turtle.shape('s square')
turtle.speed('s fastest')
turtle.fillcolor(turtle.bgcolor())
turtle.penup()
draw_square(depth=4, size=100)
turtle.hideturtle()
turtle.exitonclick()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/319314.html
標籤:
上一篇:如何避免在改變易變結構的同時對該結構進行遞回時克隆部分?
下一篇:按級別扁平化一個動態的層次結構樹
