правая сторона фрактального дерева с использованием черепахи в питоне

Я всего лишь новичок и пытаюсь создать фрактальное дерево с помощью черепахи Python, создав рекурсивную функцию. Я думаю, что у меня есть функция настолько, что она составляет всю левую сторону моего фрактала, но не делает правую сторону. Как это исправить? Любые советы будут оценены!

def svTree( trunkLength, levels ):
    """ uses the turtle drawing functions to return a tree with a specified number of levels
    input: two integers, trunkLength and levels
    """

    newtrunkLength = trunkLength *.5


    forward(trunkLength)

    if levels ==1:
           penup()


    else:
        left(45)         
        forward(trunkLength * 0.5)
        backward(trunkLength * 0.5)
        right(90)
        forward(trunkLength * 0.5)
        backward(trunkLength * 0.5)
        left(90)
        return svTree(newtrunkLength,levels-1)

person user3517740    schedule 22.04.2014    source источник
comment
Поскольку каждая рекурсия рисует две ветви, я полагаю, вам потребуется два вызова svTree, а не один.   -  person Hyperboreus    schedule 23.04.2014


Ответы (1)


Сохраните положение черепахи до рекурсии вниз по левой ветке, затем сбросьте черепаху и нарисуйте правую ветвь:

def svTree(length, level):
   if level == 1:
      return

   #draw level's trunk
   down()
   forward(length)
   up()

   #save turtle position and heading
   pos = position()
   hdg = heading()

   #draw left branch
   left(45)
   svTree(length / 2, level - 1)

   #restore turtle position and heading
   setposition(pos)
   setheading(hdg)

   #draw right branch
   right(45)
   svTree(length / 2, level - 1)

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

def svTree(length, level):
    if level == 1:
        return

    #draw level's trunk
    down()
    forward(length)
    up()

    #draw left branch
    left(45)
    svTree(length/2, level-1)

    #draw right branch
    right(90)
    svTree(length/2, level-1)

    #return cursor to state when function called
    left(45)
    backward(length)
person mtadd    schedule 22.04.2014