【问题标题】:How to turn a for-loop for turtle graphic shape into a recursive function in Python?如何在 Python 中将海龟图形形状的 for 循环转换为递归函数?
【发布时间】:2019-09-04 23:06:05
【问题描述】:

我正在尝试创建一个重复形状以使用海龟图形制作图案的函数。我不确定如何将代码更改为递归函数,这样我就不需要使用 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

【问题讨论】:

    标签: python for-loop recursion turtle-graphics


    【解决方案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 内置函数的名称,因此您不应在自己的程序中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 2018-11-27
      • 2014-03-18
      • 2013-05-31
      • 2019-04-21
      相关资源
      最近更新 更多