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
输出:
与上述方法和您当前的方法不同的是,我们可以看到每一级分支都一起增长,而不是每次都等待一条路由完成。
我创建了以下树:
但现在我希望它像这样垂直:
为了创建水平的,我使用了以下代码:
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
输出:
与上述方法和您当前的方法不同的是,我们可以看到每一级分支都一起增长,而不是每次都等待一条路由完成。