Хорошо, я нашел, как это сделать с помощью видео , которое дало мне указание разделить его пополам, а не на одну треть.
, поэтому код должен был быть
import math, turtle
window=turtle.Screen()
window.title('Sierpinski')
window.bgcolor('lightblue')
alex=turtle.Turtle()
def sierpinski(a,t,size):
if a==0:
for i in range(3):
t.forward(size)
t.left(120)
else:
sierpinski(a-1,t,size/2)
t.forward(size/2)
sierpinski(a-1,t,size/2)
t.forward(size/2)
t.left(120)
t.forward(size/2)
sierpinski(a-1,t,size/2)
t.forward(size/2)
t.left(120)
t.forward(size)
t.left(120)
sierpinski(3,alex,200)
window.mainloop()
Но может ли код быть более кратким?
Редактировать
Этого будет достаточно:
def sierpinski(a, t, size):
half = size / 2
if a >= 0:
sierpinski(a-1, t, half)
t.forward(half)
sierpinski(a-1, t, half)
t.forward(half)
t.left(120)
t.forward(half)
sierpinski(a-1, t, half)
t.forward(half)
t.left(120)
t.forward(size)
t.left(120)
Это работает, потому чтооба блока if
end else
рисовали треугольники (блок else
делал это только для перемещения курсора, но все же), но блок else
совершал рекурсивные вызовы.
Чтобы сделать это "более питонический" , вы можете поместить все это в класс:
class SierpinskiTurtle(turtle.Turtle):
def sierpinski(self, depth, size):
half = size / 2
if depth >= 0:
self.sierpinski(depth-1, half)
self.forward(half)
self.sierpinski(depth-1, half)
self.forward(half)
self.left(120)
self.forward(half)
self.sierpinski(depth-1, half)
self.forward(half)
self.left(120)
self.forward(size)
self.left(120)
alex = SierpinskiTurtle()
alex.sierpinski(3, 200)