Python 吸引大写字母的递归 Turtle 函数 I's

Python Recursive Turtle function that draws capital I's

打算使用递归用乌龟绘制它:

但我真的很不擅长这个。这就是我得到的:

代码如下: https://gyazo.com/24cebddbb111506fd6959bb91dadb481

import turtle
def draw_shape(t, level,size):
    if level == 1: #draws an I
        t.down()
        t.forward(size/2)
        t.left(90)
        t.forward(size/2)
        t.back(size)
        t.forward(size/2)
        t.left(90)
        t.forward(size)
        t.left(90)
        t.forward(size/2)
        t.back(size)
        t.up()
        t.forward(size/2)
        t.left(90)
        t.forward(size/2)

    else:
        draw_shape(t,level - 1,size)
        t.back(size/2)
        t.right(90)
        t.forward(size/2)
        t.left(90)
        draw_shape(t,level - 1,size/2)
        t.left(90)
        t.forward(size)
        t.right(90)
        draw_shape(t,level-1,size/2)
        t.right(90)
        t.forward(size/2)
        t.left(90)
        t.forward(size)
        t.right(90)
        t.forward(size/2)
        t.left(90)
        draw_shape(t,level-1,size/2)
        t.left(90)
        t.forward(size)
        t.right(90)
        draw_shape(t,level-1,size/2)

def q1():
    my_win = turtle.Screen()
    my_turtle = turtle.Turtle()
    my_turtle.speed(0.006)
    my_turtle.left(90)
    my_turtle.up()
    my_turtle.back(200)
    n = int(input('Draw shape at level: '))
    draw_shape(my_turtle,n,200)
    my_win.exitonclick()

q1()

几乎只是为了编辑 draw_shape() 函数。我在第 2 级就把它弄对了,但其余的级别开始变得不稳定并且绘制错误的大小我在错误的位置,我认为这是因为我的指针在绘制 I 之后放置的位置。任何帮助将不胜感激。

我发现你现在的代码有两个问题。

首先是下面的代码在完成后并没有把海龟放回中心点。这就是为什么较小的位被绘制在不同的随机位置,因为之前的调用将海龟留在了奇怪的地方。

第二个问题是您一开始就使用了递归调用。这并不是真正必要的,因为无论如何您稍后都会沿着 I 形状移动。

我的建议是制定基本案例 level < 1。这不需要您做任何事情(您可以立即 return)。这将替换您的整个 if level == 1 块(您需要保留的 t.down() 除外)。

def draw_shape(t, level, size):
    if level < 1: # base case
        return

    t.down() # put pen down at the start, don't recurse immediately
    t.back(size/2)
    t.right(90)
    t.forward(size/2)
    t.left(90)
    draw_shape(t, level - 1, size / 2)
    t.left(90)
    t.forward(size)
    t.right(90)
    draw_shape(t, level - 1, size / 2)
    t.right(90)
    t.forward(size / 2)
    t.left(90)
    t.forward(size)
    t.right(90)
    t.forward(size / 2)
    t.left(90)
    draw_shape(t, level - 1, size / 2)
    t.left(90)
    t.forward(size)
    t.right(90)
    draw_shape(t, level - 1, size / 2)
    t.right(90)             # add lines below to get back to start position
    t.forward(size / 2)
    t.left(90)
    t.back(size / 2)

您可以通过拿起笔并从 I 的一端跳到另一端(例如从左下角到左上角)而不是在中间的横条上画额外的时间来稍微简化一下。我保留了您的大部分代码,以使必要的更改(而不仅仅是漂亮的更改)更加清晰。