为什么这个 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)。
希望这能让一切变得更清晰:)
我需要为我的学校作业做一个,但这个代码是随机抽取的。我复制了一些 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)。
希望这能让一切变得更清晰:)