【问题标题】:Why does this sierpinski triangle draw randomly and not following the code? [closed]为什么这个 sierpinski 三角形随机绘制而不遵循代码? [关闭]
【发布时间】:2020-02-16 08:47:05
【问题描述】:

我需要为我的学校作业做一个,但这个代码是随机抽取的。我复制了一些 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 次,会使高度为负 1?在高度 0 处,它将绘制一个大三角形,并且窗口上没有从宽度开始然后上升然后下降的大三角形。同样在 else 语句中,宽度是 25,因为上面语句的三角形将 100 除以 2,然后再将宽度(50)除以 2?

【问题讨论】:

  • 你的标题说的不是(所有)你的问题。你对 Python 的理解程度如何?例如,第一个 if 检查高度是否等于 0 - 它有什么不明确的地方吗?
  • 好吧,它不会在任何地方绘制与 100x100x100 大小相同的三角形。我是初学者,但我不明白它是如何绘制的
  • 也许你应该玩弄一下turtle命令来了解它们的作用(当然还要阅读文档)。一些关于递归概念的知识也会有所帮助。
  • height 的命名确实具有误导性。它实际上是谢尔宾斯基三角形中递归级别的深度。

标签: python turtle-graphics


【解决方案1】:

在我看来,您的代码命名变量的方式非常具有误导性。 因为当这段代码使用变量height 时,它实际上并不是指“三角形的高度”。相反,此高度指示何时停止递归。

仅供参考,递归是函数调用自身的过程,如 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 个三角形(因此每边 25 总共将有 9 个三角形)。

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

【讨论】:

  • 如果宽、高为100,1。首先它会再次调用函数 triangle 并将宽度和高度更改为 50, 0 然后 t.fd 50/2= 25 然后由于高度为 0 它会转到 if 语句?
  • 哦,我现在明白了,所以三角形调用了函数,if 语句自动变为 width/2,但它下面的行不会改变宽度。我不得不玩它很长一段时间天啊,自学成才的程序员必须有很多奉献精神。
猜你喜欢
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 2013-11-27
相关资源
最近更新 更多