Python递归乌龟分形

时间:2018-03-30 21:03:42

标签: python recursion turtle-graphics fractals

我正在尝试编写一个递归乌龟程序,它将绘制一个分形树,重新创建下面的形状:

Turtle Fractal

这应该用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:

1 个答案:

答案 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

所以尽管有这样的测试,lengthdepth仍然不会改变:

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()来电完全匹配。

enter image description here