2013-11-15 2 views
3

У меня есть домашнее задание, что я просто не могу понять. Это не имеет для меня никакого смысла, и я даже не знаю, пойду ли я в правильном направлении в этот момент.Рекурсия с модулем черепах (Python 3.1)

вот мой код до сих пор:

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

Вы находитесь на правильном пути.

Глядя на него, я думаю, вам следует избавиться от ваших методов 2 smallerRec (хотя код в smallerRec по-прежнему будет использоваться). У вас должен быть только 1 метод, который вызывает draw_rectangle() - ваш метод rectangle_art.

Этот метод должен принимать те же параметры, которые вы используете (center_x, center_y, width, height, level, myTurtle).

Он должен нарисовать прямоугольник x,y из width,height. Тогда, если level больше 0, то он должен вызывать себя 4 раза, чтобы нарисовать прямоугольник на каждом из его углов с шириной и высотой уменьшается, а уровень уменьшается на 1 (как вы делаете).

Таким образом, если вы начинаете по телефону 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. 

Подсказка:

Я был бы соблазн сделать х, у относятся к центру прямоугольника в методе drawRectangle. Просто потому, что тогда вы можете рассчитать координаты угловых прямоугольников, не зная ширины и высоты меньшего прямоугольника, который вы собираетесь рисовать.

Если x,y см в верхнем левом углу. Чтобы нарисовать нижний правый угол прямоугольника вы бы назвали

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

Если вы изменили метод DrawRectangle так, что x,y относятся к центру прямоугольника, а затем нарисовать нижний правый угол прямоугольника вы назвали бы

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

В любом случае все будет работать.

Смежные вопросы