Python 海龟的递归树

Recursion Tree with 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)

现在,我正在尝试使用以下代码垂直创建它,但它卡在了(我认为)第 right(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) 
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

输出:

与上述方法和您当前的方法不同的是,我们可以看到每一级分支都一起增长,而不是每次都等待一条路由完成。