Как превратить цикл for для графической формы turtle в рекурсивную функцию в Python?

#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)
 

Конечным результатом должен быть шаблон, который выглядит следующим образом:

http://www.gwydir.demon.co.uk/jo/tess/bighexsqtri.gif

Ответ №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, поэтому вы не должны использовать ее для своей собственной программы.