Python递归海龟函数,它吸引我的资本

想用乌龟用递归绘制这个:

https://gyazo.com/4a6d64fd83c1dbf894914bb91c8189b1

但我在这方面真的很糟糕。 这是我得到的:

以下是代码: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形状前进。

我建议让基本情况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)

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

链接地址: http://www.djcxy.com/p/80705.html

上一篇: Python Recursive Turtle function that draws capital I's

下一篇: sum of squares of integers