Найти - Пользователи
Полная версия: модуль turtle рекурсия
Начало » Python для новичков » модуль turtle рекурсия
1
dobriy_dada
Здравствуйте, помогите пожалуйста, вот такой код
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 :-(
dobriy_dada
в принципе понял, вот такой код нужно составить, чтобы запустить на 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)

Но непонятно, как можно было додуматься написать такой код, чтобы он был небольшой и чтобы получилась красивая картинка :-) На мой взгляд сложно додуматься до такого :-(
r00tl3ss
tree(75, t)
Функция вызывается с параметром branchLen=75.
Далее, при каждом рекурсивном вызове он уменьшается на 15, пока не станет <= 5.
Другими словами следующий вызов функции будет:
tree(60, t)
и т.д.
dobriy_dada
r00tl3ss дак это понятно, просто пока для меня сложно увязать это с поворотами и движениями назад и главная сложность - это в какое именно место вставить рекурсию, ведь в коде там аж 2 вставки
py.user.next
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()
dobriy_dada
спасибо большое
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB