使用turtle模块递归(Python 3.1)

时间:2013-11-15 15:33:57

标签: python turtle-graphics

我有一份我无法掌握的家庭作业。这对我来说毫无意义,我甚至不知道我现在是否朝着正确的方向前进。

到目前为止,这是我的代码:

import turtle

def draw_rectangle(center_x, center_y, width, height, myTurtle):
    myTurtle.penup()
    myTurtle.goto(center_x - width/2, center_y - height/2)
    myTurtle.pendown()
    myTurtle.goto(center_x - width/2, center_y + height/2)
    myTurtle.goto(center_x + width/2, center_y + height/2)
    myTurtle.goto(center_x + width/2, center_y - height/2)
    myTurtle.goto(center_x - width/2, center_y - height/2)


def smallerRec(width, height, level, myTurtle):

    rectangle_art( width/2, -height/2, width/2 , height/2, level-2, myTurtle)
    rectangle_art(-width/2,  height/2, width/2 , height/2, level-2, myTurtle)
    rectangle_art(-width/2, -height/2, width/2 , height/2, level-2, myTurtle)
    rectangle_art( width/2,  height/2, width/2 , height/2, level-2, myTurtle)

def smallerRec3(width, height, level, myTurtle):    
    bottom_y = 25
    top_y = 75

    left_x = 50
    right_x = 150

    rectangle_art( right_x,  top_y,    width/level , height/level, level-3, myTurtle)
    rectangle_art( right_x,  bottom_y, width/level , height/level, level-3, myTurtle)
    rectangle_art( left_x,   top_y,    width/level , height/level, level-3, myTurtle)
    rectangle_art( left_x,   bottom_y, width/level , height/level, level-3, myTurtle)

def rectangle_art(center_x, center_y, width, height, level, myTurtle):

    if  (level <= 1):
        draw_rectangle(center_x, center_y, width, height, myTurtle)
    elif(level == 2):
        draw_rectangle(center_x, center_y, width, height, myTurtle)
        smallerRec(width, height, level, myTurtle)
    elif(level == 3):
        draw_rectangle(center_x, center_y, width, height, myTurtle)
        smallerRec (width, height, level, myTurtle)
        smallerRec3(width, height, level, myTurtle)



def main():
    myTurtle = turtle.Turtle()
    myWindow = turtle.Screen()
    rectangle_art(0, 0, 200, 100, 3, myTurtle)
    myWindow.exitonclick()

main()

这是该代码的输出: outout of the code above http://puu.sh/5j491.png

以下是它的样子:

the assignment http://puu.sh/5j4ds.png

在递归方面,我是朝着正确的方向前进吗?

1 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。

看着它我觉得你应该摆脱你的2 smallerRec方法(尽管仍会使用smallerRec中的代码)。您应该只有一种方法可以调用draw_rectangle() - 您的rectangle_art方法。

此方法应采用与(center_x, center_y, width, height, level, myTurtle)相同的参数。

它应该在x,y width,height处绘制一个矩形。然后,如果level大于0,它应该调用自己4次,在每个角上绘制一个矩形,宽度和高度减小,水平减少1(就像你正在做的那样)。 p>

这种情况下,如果您首先使用rectangle_art致电level=2,则会:

Draw rectangle, level > 0? yes its 2, draw rectangle at each of my corners
  At each level 2 corner:
  Draw rectangle, level > 0? yes its 1, draw rectangle at each of my corners
    At each level 1 corner:
    Draw rectangle, level > 0? no its 0, youre done.

<强>提示:

我很想让x,y引用drawRectangle方法中矩形的中心。因为那时你可以计算角矩形的坐标,而不知道你要绘制的较小矩形的宽度和高度。

如果x,y指的是左上角。要绘制右下角矩形,请调用

drawRectangle(x+width-(newWidth/2), y+height-(newHeight/2), newWidth, newHeight)

如果您更改了drawRectangle方法,以便x,y引用矩形的中心,则绘制您要调用的右下角矩形

drawRectangle(x+width, y+height, newWidth, newHeight)

无论哪种方式都可行。