#python #for-loop #recursion #turtle-graphics
#python #for-loop #рекурсия #черепаха-графика
Вопрос:
Я пытаюсь создать функцию, которая повторяет форму, чтобы создать шаблон с использованием графики turtle. Я не уверен, как я мог бы изменить свой код, чтобы превратить его в рекурсивную функцию, чтобы мне не нужно было использовать цикл for для создания каждого шага.
Пока что я создал общую форму посередине и нахожусь в процессе создания шаблона:
import turtle
t = turtle.Turtle()
t2 = turtle.Turtle()
t3 = turtle.Turtle()
t4 = turtle.Turtle()
t5 = turtle.Turtle()
t6 = turtle.Turtle()
t7 = turtle.Turtle()
t8 = turtle.Turtle()
t9 = turtle.Turtle()
t10 = turtle.Turtle()
t11 = turtle.Turtle()
t12 = turtle.Turtle()
for i in (t,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12):
i.speed(10)
def hex(rep):
if rep > 1:
for i in range(6):
t.forward(50)
t.left(60)
t.right(90)
t2.forward(50)
t2.right(90)
t3.forward(50)
t3.right(30)
for i in range(2):
for a in (t4, t5):
a.forward(50)
a.left(60)
t4.right(150)
t5.right(90)
for i in range(3):
for a in (t6, t7):
a.forward(50)
a.left(60)
t6.right(150)
t7.right(90)
for i in range(4):
for a in (t8, t9):
a.forward(50)
a.left(60)
t8.right(150)
t9.right(90)
for i in range(5):
for a in (t10, t11):
a.forward(50)
a.left(60)
t10.right(150)
t11.right(90)
t12.left(210)
for i in (t,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12):
i.forward(50)
t.left(90)
for i in range(12):
t.forward(50)
t.left(30)
t.right(90)
for i in (t,t3,t5,t7,t9,t11):
for a in range(9):
i.right(30)
i.forward(50)
hex(2)
Конечным результатом должен быть шаблон, который выглядит следующим образом:
Ответ №1:
В духе «зачем использовать двенадцать черепах, когда подойдет одна», вот мое рекурсивное решение вашей проблемы:
from turtle import Screen, Turtle
RADIUS = 100
SIDES = 12
EXTENT = 360 / 12
def pattern(repetitions):
turtle.right(EXTENT/2)
for segment in range(12):
turtle.circle(RADIUS, EXTENT, 1)
if repetitions and segment % 2 == 0:
heading = turtle.heading()
position = turtle.position()
turtle.right(90 - EXTENT/2)
pattern(repetitions - 1)
turtle.setposition(position)
turtle.setheading(heading)
screen = Screen()
turtle = Turtle(visible=False)
turtle.penup()
turtle.goto(-RADIUS/4, -RADIUS) # roughly center drawing on window
turtle.pendown()
screen.tracer(False) # because I have no patience!
pattern(4)
screen.tracer(True)
screen.exitonclick()
Рисунок здесь не является оптимальным и может потребовать работы, поскольку он выполняет перерисовку линий, чего всегда лучше избегать. (Я не имею в виду просто поднимать перо, но избегать необходимости снова пересекать линию.)
Также обратите внимание, что hex()
это имя встроенной функции Python, поэтому вы не должны использовать ее для своей собственной программы.