Дерево рекурсии с Python Turtle

Я создал следующее дерево:

Дерево рекурсии с Python Turtle

Но теперь я хочу, чтобы он был вертикальным, как это:

Дерево рекурсии с Python Turtle

Для создания горизонтального я использовал следующий код:

from turtle import *

def tree(length,order):
    if length < (length/order):
           return       
    forward(length)      
    left(45)         
    tree(length * 0.5,length/order)      
    right(90)         
    tree(length * 0.5,length/order)      
    left(45)          
    backward(length)       
    return              
tree (200, 5)

Теперь я пытаюсь создать его по вертикали с помощью следующего кода, но он застрял (я думаю) в строке справа (45):

def tree(length,order):
    if length < (length/order):
           return       
    rt(-90)
    forward (length)
    right(45)
    tree(length * 0.5,length/order)      
    left(225)         
    tree(length * 0.5,length/order)      
    left(90)          
    backward(length) 
    return

tree (200,5) 
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
540
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
import turtle

def tree(t,length,order):
    if length < (length/order):
           return       
    t.forward(length)      
    t.left(45)         
    tree(t,length * 0.5,length/order)      
    t.right(90)         
    tree(t,length * 0.5,length/order)      
    t.left(45)          
    t.backward(length)       
    return

screen = turtle.Screen ( ) 
tip = turtle.Turtle() 
tip.shape ("turtle") 
tip.speed (1)   
  
tip.left(90)  # vertical start
tree (tip, 200, 5)

Это может быть так же просто, как однострочное исправление:

mode('logo')

Среди прочего, режим 'logo' меняет 0 градусов, чтобы быть ближе к верхней части экрана, а не вправо:

from turtle import *

def tree(length, order):
    if length >= length / order:
        forward(length)
        left(45)
        tree(length / 2, length / order)
        right(90)
        tree(length / 2, length / order)
        left(45)
        backward(length)

mode('logo')

tree(200, 5)

Эй смотри! Вот программа Recursion Tree, встроенная во встроенный пакет turtle:

#!/usr/bin/env python3
"""      turtle-example-suite:

             tdemo_tree.py

Displays a 'breadth-first-tree' - in contrast
to the classical Logo tree drawing programs,
which use a depth-first-algorithm.

Uses:
(1) a tree-generator, where the drawing is
quasi the side-effect, whereas the generator
always yields None.
(2) Turtle-cloning: At each branching point
the current pen is cloned. So in the end
there are 1024 turtles.
"""
from turtle import Turtle, mainloop
from time import clock

def tree(plist, l, a, f):
    """ plist is list of pens
    l is length of branch
    a is half of the angle between 2 branches
    f is factor by which branch is shortened
    from level to level."""
    if l > 3:
        lst = []
        for p in plist:
            p.forward(l)
            q = p.clone()
            p.left(a)
            q.right(a)
            lst.append(p)
            lst.append(q)
        for x in tree(lst, l*f, a, f):
            yield None

def maketree():
    p = Turtle()
    p.setundobuffer(None)
    p.hideturtle()
    p.speed(0)
    p.getscreen().tracer(30,0)
    p.left(90)
    p.penup()
    p.forward(-210)
    p.pendown()
    t = tree([p], 200, 65, 0.6375)
    for x in t:
        pass
    print(len(p.getscreen().turtles()))

def main():
    a=clock()
    maketree()
    b=clock()
    return "done: %.2f sec." % (b-a)

if __name__ == "__main__":
    msg = main()
    print(msg)
    mainloop()

Теперь сосредоточьтесь на функции make_tree:

def maketree():
    p = Turtle()
    p.setundobuffer(None)
    p.hideturtle()
    p.speed(0)
    p.getscreen().tracer(30,0)
    p.left(90) # HERE! They turned left by 90 degrees!
    p.penup()
    p.forward(-210)
    p.pendown()
    t = tree([p], 200, 65, 0.6375)
    for x in t:
        pass
    print(len(p.getscreen().turtles()))

Из этого встроенного файла tree.py просто удалив некоторый код без добавления, вы можете получить:

from turtle import Turtle

def tree(plist, l, a, f):
    if l > 3:
        lst = []
        for p in plist:
            p.forward(l)
            q = p.clone()
            p.left(a)
            q.right(a)
            lst.append(p)
            lst.append(q)
        for x in tree(lst, l * f, a, f):
            yield None

p = Turtle()
p.hideturtle()
p.getscreen().tracer(30,0)
p.left(90)
for x in tree([p], 120, 65, 0.6375):
    pass

Выход:

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

Другие вопросы по теме