Это код для треугольника Серпинского , я просто изменил переменную степени на 2 (при первоначальном вызове sierpinsky()
в main()
) из исходного текста, и я запускаю его с использованием Python 3,5
import turtle
def drawTriangle(points,color,myTurtle):
myTurtle.fillcolor(color)
myTurtle.up()
myTurtle.goto(points[0][0],points[0][1])
myTurtle.down()
myTurtle.begin_fill()
myTurtle.goto(points[1][0],points[1][1])
myTurtle.goto(points[2][0],points[2][1])
myTurtle.goto(points[0][0],points[0][1])
myTurtle.end_fill()
def getMid(p1,p2):
return ( (p1[0]+p2[0]) / 2, (p1[1] + p2[1]) / 2)
def sierpinski(points,degree,myTurtle):
colormap = ['blue','red','green','white','yellow',
'violet','orange']
drawTriangle(points,colormap[degree],myTurtle)
if degree > 0:
sierpinski([points[0],
getMid(points[0], points[1]),
getMid(points[0], points[2])],
degree-1, myTurtle)
sierpinski([points[1],
getMid(points[0], points[1]),
getMid(points[1], points[2])],
degree-1, myTurtle)
sierpinski([points[2],
getMid(points[2], points[1]),
getMid(points[0], points[2])],
degree-1, myTurtle)
def main():
myTurtle = turtle.Turtle()
myWin = turtle.Screen()
myPoints = [[-100,-50],[0,100],[100,-50]]
sierpinski(myPoints,2,myTurtle)
myWin.exitonclick()
main()
Когда я запускаю этот код, я ясно вижу, что черепаха рисует первый внутренний треугольник слева при первом рекурсивном вызове:
sierpinski([points[0], getMid(points[0], points[1]), getMid(points[0], points[2])], 1, myTurtle)
и затем он начинает рисовать левый, верхний и правый треугольники внутри этого в указанном порядке. Все идет нормально.
Тогда следующий треугольник, который будет нарисован, - это тот, что сверху (большего треугольника) с вызовом:
sierpinski([points[1], getMid(points[0], points[1]), getMid(points[1], points[2])], 1, myTurtle)
Вот где это сбивает с толку, я ожидаю, что рекурсия сначала начнет рисовать нижний левый треугольник внутри этого треугольника. Но это не так, это начинается с рисования верхнего.
Когда я запускаю этот фиктивный код, который имитирует рекурсию в приведенном выше коде:
def sierpinski(points,degree):
print(points + " " + str(degree))
if degree > 0:
sierpinski("bottom left triangle", degree-1)
sierpinski("top triangle", degree-1)
sierpinski("bottom right triangle", degree-1)
sierpinski("start", 2)
Вывод:
start 2
bottom left triangle 1
bottom left triangle 0
top triangle 0
bottom right triangle 0
top triangle 1
bottom left triangle 0
top triangle 0
bottom right triangle 0
bottom right triangle 1
bottom left triangle 0
top triangle 0
bottom right triangle 0
Мы ясно видим порядок, в котором нарисованы треугольники. Ребята, скажите, что мне не хватает?