我正在尝试编写一个递归乌龟程序,它将绘制一个分形树,重新创建下面的形状:
这应该用depth = 3来完成,所以三个不同的正方形水平。我的问题是,凭借我已经拥有的代码,屏幕上的乌龟仍然无法移动。这是我的代码到目前为止,任何帮助表示赞赏:
import turtle
def main():
turtle.speed(0)
turtle.screensize(1000,1000)
turtle.exitonclick()
turt = turtle.Turtle()
squares(turt, length, depth)
def squares(t,length, depth):
length = 200
depth = 3
amt = 1
if depth == 0:
return
elif depth == 3:
t.penup()
t.goto(-1000,-1000)
t.forward(length)
t.left(90)
t.forward(length)
t.left(90)
t.forward(length)
t.left(90)
t.forward(length)
squares(t, length/2, depth - 1)
elif depth == 2:
答案 0 :(得分:0)
这个不完整的elif
会使代码无法运行:
elif depth == 2:
您定义main()
,但无法调用它:
def main():
您需要在最后添加对main()的显式调用:
main()
如果你真的打电话给main()
,这个过早的exitionclick()
会在您调用squares()
之前将控制权交给tkinter:
turtle.exitonclick()
turt = turtle.Turtle()
squares(turt, length, depthc)
exitonclick()
应该是main()
的最后一个语句,或者在函数外部的主要语句之后发生。当你覆盖两个参数时,你的递归永远不会发生:
def squares(t,length, depth):
length = 200
depth = 3
所以尽管有这样的测试,length
和depth
仍然不会改变:
if depth == 0:
return
修复所有这些不会让你得到一个能够吸引你想要的分形的程序,但修复它们可能是必要的第一步。
要使代码绘制分形,您需要将调用与squares()
交错,以便每次向前移动乌龟。最后不要这样做:
t.forward(length)
t.left(90)
t.forward(length)
t.left(90)
t.forward(length)
t.left(90)
t.forward(length)
squares(t, length/2, depth - 1)
但更像是:
for _ in range(4):
t.forward(length / 4)
if depth > 1:
t.right(90)
squares(t, length / 2, depth - 1)
t.left(90)
t.forward(3 * length / 4)
...
在递归分形中应避免使用这样的绝对值:
t.goto(-1000,-1000)
当然,让您的pendown()
来电与penup()
来电完全匹配。