【问题标题】:Make Sierpinski using squares and recursion使用平方和递归制作谢尔宾斯基
【发布时间】:2015-10-22 15:25:43
【问题描述】:

所以我正在尝试使用正方形制作谢尔宾斯基。我想递归地做这样的事情

我想改变乌龟的位置,让它在正方形的边上形成更多的正方形

我似乎无法改变海龟的位置,使它变成这个形状。海龟刚刚开始在我制作的 4 个方格之外制作方格

我的代码是

from math import sqrt
import turtle
window=turtle.Screen
t=turtle.Turtle()
t.color("black")
s=100

def Draw_sirepinski_square(t,s):
    for i in range (1,5):
        t.forward(s)
        t.left(90)

    t.left(45)
    t.forward(sqrt((s**2)+(s**2)))
    t.right(45)
    t.backward(s)
    t.right(45)
    t.forward(sqrt((s**2)+(s**2)))
    t.left(45)
    t.backward(s)

def sierpinski(n):
    if n ==1:
        Draw_sirepinski_square(t,s)

    else:    
        sierpinski(n-1)

        curPos = t.pos()
        t.penup()
        t.setpos(curPos[0]-s/(2*(n-1)), curPos[1]+s)
        t.pendown()

        Draw_sirepinski_square(t, s/(2*(n-1)))

        t.penup()
        t.setpos(curPos)
        t.setpos(curPos[0]+s, curPos[1]+s)
        t.pendown()

        Draw_sirepinski_square(t, s/(2*(n-1)))

        t.penup()
        t.setpos(curPos)
        t.setpos(curPos[0]+s, curPos[1]-s/(2*(n-1)))
        t.pendown()
        print(curPos)

        Draw_sirepinski_square(t, s/(2*(n-1)))
        t.penup()
        t.setpos(curPos)
        t.setpos(curPos[0]+s, curPos[1]+s)
        t.pendown()
        print(curPos)

sierpinski(3)

【问题讨论】:

  • 那么...你有什么问题?
  • 我似乎无法改变海龟的位置以使其形成这种形状。海龟刚刚开始在我制作的 4 个方格内制作方格
  • 请提供minimal reproducible example 并明确说明问题。
  • 完成(y)我希望这样做

标签: python recursion turtle-graphics


【解决方案1】:

当我运行您的代码并正确地使用标签时,我得到的东西更接近于谢尔宾斯基模式,而不是“我刚刚制作的 4 个正方形内的正方形”。输出如下所示:

尝试重新定义 s 或为函数内部的行进距离设置新变量,而不是调用 s 的代数表达式。随着您变得越来越小,您的 s(如所写)仍然始终为 100 - 例如: t.setpos(curPos[0]+s

【讨论】:

  • Outside* 对不起那个错误
【解决方案2】:

首先从高层次描述问题。谢尔宾斯基垫圈由一个带有 X 的正方形和一个位于正方形三个角的一半大小的谢尔宾斯基垫圈组成。所以,我们需要的参数是边长和绘制正方形的位置。可能最简单的方法是使用正方形中心的坐标来指定正方形的位置。此外,正如您在代码中所认识到的那样,有必要使用某种级别数来停止绘图,因为尝试绘制实际的数学谢尔宾斯基垫片会导致无限循环。

除了清理参数之外,您还需要重新考虑递归调用。 sierpinski 应该调用自身 3 次。它应该只直接调用一次Draw_Sierpinski_square。对Draw_Sierpinski_square 的所有其他调用都应通过递归调用间接进行。再次查看高级描述——一个带有 X 的正方形和四个垫圈。

顺便说一句,我认为Draw_Sierpinski_square 这个名字的选择很糟糕,它让你感到困惑。如果您只是将其称为 Draw_squaresquareX 或其他名称,您就不会像被误入歧途了。

我认为你应该能够从这里得到它,但是如果我需要为你澄清任何事情,请告诉我。

我突然想到我应该贴一张我的画的照片,以防我误解了规格。这是我认为您发布的代码应该绘制的内容:

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多