Python递归图

2024-04-23 18:34:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Turtle Fractal

三个不同深度的正方形应该这样做。我的问题是,有了代码,屏幕上的乌龟还是一动不动。以下是我目前为止的代码,如有任何帮助,我们将不胜感激:

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:

Tags: 代码程序def绘制leftlengthforward分形
1条回答
网友
1楼 · 发布于 2024-04-23 18:34:47

此不完整的elif将使代码无法运行:

elif depth == 2:

您定义了main(),但未能调用它:

^{pr2}$

需要在main()结束时添加一个显式调用:

main()

如果您实际调用main(),这个过早的{}将在您调用squares()之前将控制权移交给tkinter:

turtle.exitonclick()
turt = turtle.Turtle()
squares(turt, length, depthc)

exitonclick()应该是main()的最后一个语句,或者发生在函数外部main之后。当您重写两个参数时,不会发生递归:

def squares(t,length, depth):
    length = 200
    depth = 3

因此length和{}永远不会改变,尽管进行了这个测试:

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

相关问题 更多 >