为什么这个 sierpinski 三角形随机绘制而不是按照代码绘制?

Why does this sierpinski triangle draw randomly and not following the code?

我需要为我的学校作业做一个,但这个代码是随机抽取的。我复制了一些 Stack Overflow 代码,但我不明白其中的逻辑。有人可以向我解释吗?

import turtle
def triangle(width,height):

    if height==0:

        for i in range(3):
            t.fd(width)
            t.left(120)
    else:

        triangle(width/2,height-1)
        t.fd(width/2)
        triangle(width/2,height-1)
        t.bk(width/2)
        t.left(60)
        t.fd(width/2)
        t.right(60)
        triangle(width/2,height-1)
        t.left(60)
        t.bk(width/2)
        t.right(60)


window = turtle.Screen()
t = turtle.Turtle()
triangle(100,2)
window.exitonclick()

第一个 if 语句的作用是什么?第一个 if 语句绘制最后一个三角形还是什么?它在哪里绘制三角形,因为它从未在脚本上绘制过那么大的三角形。唯一宽度与 100x100x100 相同的三角形是外面的三角形,它由许多小三角形组成。

函数中的(height-1)3次,那会使height为负1?在高度为 0 时,它会绘制一个大三角形,并且 window 上没有大三角形从宽度开始然后向上然后向下。同样在 else 语句中,宽度为 25,因为上面语句中的三角形将 100 除以 2,然后再将宽度 (50) 除以 2?

在我看来,您的代码命名变量的方式非常具有误导性。 因为当这段代码使用变量height时,它实际上并没有引用'height of the triangle'。相反,此高度指示何时停止递归。

仅供参考,递归是函数调用自身的过程,如 f(f(f(f())))。 刚才举的例子,是4次迭代的递归,因为函数f调用了自己4次

如果传递给 triangle() 的变量 height 是 0,第一个 if 语句知道它不需要做任何递归,所以它只画一个边长为 100 的三角形.

if height==0:

        for i in range(3):
            t.fd(width)
            t.left(120)

现在,如果 height 变量为 1,它会调用三个新的 triangle 函数,每个 height 变量为 0,每边 50。

else:

        triangle(width/2,height-1) #notice how height is reduced by one
        t.fd(width/2)
        triangle(width/2,height-1)
        t.bk(width/2)
        t.left(60)
        t.fd(width/2)
        t.right(60)
        triangle(width/2,height-1)
        t.left(60)
        t.bk(width/2)
        t.right(60)

所以它绘制了 3 个较小的三角形。

height变量2,假设三个三角形中的每一个都调用了另外3个三角形(所以总共有9个三角形每边25)。

希望这能让一切变得更清晰:)