Как вернуть черепаху к ее началу в функции рекурсии - PullRequest
0 голосов
/ 13 сентября 2018

У меня проблемы с написанием рекурсивной функции, которая рисует круги на определенную «глубину».

  • Например, на глубине 1 программа должна нарисовать это: Глубина 1
  • На глубине два программа должна нарисовать это: глубина 2
  • На глубине три программа должна нарисовать это: глубина 3
  • И для справки, моя программа рисует это: myTurtleDrawing
import turtle

# These are basic instructions that do not affect the drawing if changed, only the appearance of the entities within the window
turtle.mode('logo')
turtle.speed(1)
turtle.shape('classic')
turtle.title("Circle")


def recCircle(d, r):
    if d == 0:
        pass
    if d == 1:
        print("Drawing to the depth of: ", d)
        turtle.down()
        turtle.circle(r)
        turtle.up()
    else:
        print("Drawing to the depth of: ", d)
        turtle.circle(r)
        turtle.seth(90)
        turtle.down()
        recCircle(d - 1, (r / 2))  # Draw the leftmost circle
        turtle.seth(360)
        turtle.up
        turtle.seth(270)
        turtle.forward(2 * r)
        turtle.down()
        recCircle(d - 1, - r / 2)  # Draw the rightmost circle
        turtle.up()
        turtle.seth(360)
        turtle.forward(2*r)


def main():
    d = 3                   #depth of recursion
    r = 100                 #radius of circle
    recCircle(d, r)
    turtle.done()


main()

Я полагаю, что проблема заключается в строке 20

turtle.circle(r)

Iне могу понять, как вернуть черепаху в ту же локацию и ориентацию.

turtle.home или turtle.goto, как я пытаюсь не использовать эти

1 Ответ

0 голосов
/ 14 сентября 2018

Конкретные проблемы с вашим кодом:

turtle.mode('logo')

Я понимаю желание работать с севером == 0, но в случае такого дизайна это не в ваших интересах, и я бы остался по умолчаниюориентации.Это не будет работать:

turtle.up

Это должно быть turtle.up().Я не вижу, как вы получили ваш пример вывода с этим в коде, поскольку он должен выдать ошибку.Это нормально:

turtle.seth(270)

, если вы принимаете вертикальную ориентацию.Но в целом, если мы хотим рисовать под любым углом, вы не можете использовать setheading(), поскольку он такой же абсолютный, как turtle.goto() или turtle.home().Но это, кажется странным:

    turtle.seth(360)

против.просто turtle.setheading(0).Ключевой концепцией при выполнении рисунка, подобного этому, является возвращение черепахи туда, где она началась, либо неявно в команде рисования, либо явно, отменив все, что вы сделали для позиционирования черепахи.Ниже моя полная переделка вашего кода:

from turtle import Screen, Turtle

def recCircle(depth, radius):
    if depth == 0:
        return

    print("Drawing to the depth of: ", depth)
    turtle.pendown()
    turtle.circle(radius)
    turtle.penup()

    if depth > 1:
        length = 11 * radius / 8  # no specific ratio provided, so eyeballed

        turtle.left(45)
        turtle.forward(length)
        turtle.right(45)
        recCircle(depth - 1, radius / 2)  # Draw the leftmost circle
        turtle.backward((2 * length ** 2) ** 0.5)
        recCircle(depth - 1, radius / 2)  # Draw the rightmost circle
        turtle.right(45)
        turtle.forward(length)
        turtle.left(45)

screen = Screen()
screen.title("Circle")

turtle = Turtle('classic')
turtle.speed('fast')

depth = 3  # depth of recursion
radius = 100  # radius of circle

recCircle(depth, radius)

screen.exitonclick()

enter image description here

...