Уведомления

Группа в Telegram: @pythonsu

#1 Май 4, 2016 18:34:21

dobriy_dada
Зарегистрирован: 2015-09-04
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

модуль turtle рекурсия

Здравствуйте, помогите пожалуйста, вот такой код

import turtle
def tree(branchLen,t):
    if branchLen > 5:
        t.forward(branchLen)
        t.right(20)
        tree(branchLen-15,t)
        t.left(40)
        tree(branchLen-15,t)
        t.right(20)
        t.backward(branchLen)
def main():
    t = turtle.Turtle()
    myWin = turtle.Screen()
    t.left(90)
    t.up()
    t.backward(100)
    t.down()
    t.color("green")
    tree(75,t)
    myWin.exitonclick()

Не пойму как работает функция tree, когда вызывается
tree(branchLen-15,t)
становится непонятна последовательность операций, вроде в рекурсии укладываются параметры в стек, но мне непонятно в каком порядке они укладываются и почему вообще появляется этот стек?
Я пробовал убирать по одной строке из функции tree, но “дерево” рисуется только при наличии всех строк, это кажется какой-то магией :-) никак не пойму как это работает и когда ввожу в pythontutor.com, чтобы посмотреть последовательность операций, то он “не знает” модуля turtle :-(

Офлайн

#2 Май 4, 2016 18:58:01

dobriy_dada
Зарегистрирован: 2015-09-04
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

модуль turtle рекурсия

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

def tree(branchLen):
    if branchLen > 5:
        print('вперёд на расстояние',branchLen)
        print('поворот вправо на 20')
        tree(branchLen-15)
        print('поворот влево на 40')
        tree(branchLen-15)
        print('поворот вправо на 20')
        print('назад на расстояние',branchLen)
tree(75)

Но непонятно, как можно было додуматься написать такой код, чтобы он был небольшой и чтобы получилась красивая картинка :-) На мой взгляд сложно додуматься до такого :-(

Офлайн

#3 Май 4, 2016 18:59:24

r00tl3ss
Зарегистрирован: 2016-03-31
Сообщения: 25
Репутация: +  5  -
Профиль   Отправить e-mail  

модуль turtle рекурсия

tree(75, t)
Функция вызывается с параметром branchLen=75.
Далее, при каждом рекурсивном вызове он уменьшается на 15, пока не станет <= 5.
Другими словами следующий вызов функции будет:
tree(60, t)
и т.д.

Офлайн

#4 Май 4, 2016 20:16:20

dobriy_dada
Зарегистрирован: 2015-09-04
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

модуль turtle рекурсия

r00tl3ss дак это понятно, просто пока для меня сложно увязать это с поворотами и движениями назад и главная сложность - это в какое именно место вставить рекурсию, ведь в коде там аж 2 вставки

Офлайн

#5 Май 5, 2016 02:35:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

модуль turtle рекурсия

dobriy_dada
Я пробовал убирать по одной строке из функции tree, но “дерево” рисуется только при наличии всех строк, это кажется какой-то магией :-) никак не пойму как это работает
Прочитай описание основных принципов для составления/понимания рекурсивной функции.

dobriy_dada
Но непонятно, как можно было додуматься написать такой код, чтобы он был небольшой и чтобы получилась красивая картинка :-) На мой взгляд сложно додуматься до такого :-(
Сначала пишется функция для самой маленькой веточки, которая там в конце получается. А потом эта функция немного меняется (добавляется развилка), чтобы в одном случае она рисовала маленькую веточку, а в другом - просто переходила.

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

dobriy_dada
вроде в рекурсии укладываются параметры в стек
Не параметры укладываются в стек, а вызовы функции выстраиваются в стек. Рекурсивная функция строит лестницу из своих вызовов, пока на самой нижней ступеньке не произойдёт возврат.

Сначала он делает такой код
import turtle
 
def tree(branchLen, t):
    t.forward(branchLen)
    t.right(20)
    t.left(40)
    t.right(20)
    t.backward(branchLen)
 
def main():
    t = turtle.Turtle()
    myWin = turtle.Screen()
    t.left(90)
    t.up()
    t.backward(100)
    t.down()
    t.color("green")
    tree(5, t)
    myWin.exitonclick()
 
main()

А потом его дорабатывает
import turtle
 
def tree(branchLen, t):
    t.forward(branchLen)
    t.right(20)
    t.forward(branchLen)
    t.backward(branchLen)
    t.left(40)
    t.forward(branchLen)
    t.backward(branchLen)
    t.right(20)
    t.backward(branchLen)
 
def main():
    t = turtle.Turtle()
    myWin = turtle.Screen()
    t.left(90)
    t.up()
    t.backward(100)
    t.down()
    t.color("green")
    tree(5, t)
    myWin.exitonclick()
 
main()



Отредактировано py.user.next (Май 5, 2016 02:59:35)

Офлайн

#6 Май 5, 2016 04:28:23

dobriy_dada
Зарегистрирован: 2015-09-04
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

модуль turtle рекурсия

спасибо большое

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version