首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >利用海龟和递推函数的Sierpinski三角形

利用海龟和递推函数的Sierpinski三角形
EN

Stack Overflow用户
提问于 2018-06-02 02:08:55
回答 2查看 2.3K关注 0票数 0

我试图理解递归函数,它们看起来非常复杂。到目前为止,我唯一了解到的是,他们需要的是一个基本案例,这是基于归纳的证据。到目前为止,程序员是如何看待简单的基本情况的。在一本书中,只使用一行基本案例解决了分形问题。在Sierpinski三角形中,我需要这么多行代码。好吧,现在我离它很近了,但仍然遥不可及。下面是适用于订单0和1的代码,但是对于更高的订单,它增加了更多的空间。我知道这不是弦乐密码,但那是我能写的最好的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import math, turtle

window=turtle.Screen()
window.title('Sierpinski')
window.bgcolor('lightblue')

alex=turtle.Turtle()

def sierpinski(a,t,size):
    if a==0:
        for i in range(3):
            t.forward(size)
            t.left(120)
    else:
       sierpinski(a-1,t,size/3)
       t.forward(size/3)
       sierpinski(a-1,t,size/3)
       t.forward(size/3)
       t.left(120)
       t.forward(size/3)
       sierpinski(a-1,t,size/3)
       t.forward(size/3)
       t.left(120)
       t.forward(size*2/3)
       t.left(120)

sierpinski(3,alex,200)

window.mainloop()

是的,有点长,我的思维过程还不清楚。

  1. 有人能解释我的密码出了什么问题吗?
  2. 怎么才能制造出更多的丙酮呢?
EN

回答 2

Stack Overflow用户

发布于 2018-06-02 02:32:49

好的,我找到了如何在视频的帮助下做这件事,它指示我把它分成两半,而不是三分之一。

所以代码应该是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import math, turtle

window=turtle.Screen()
window.title('Sierpinski')
window.bgcolor('lightblue')

alex=turtle.Turtle()

def sierpinski(a,t,size):
    if a==0:
        for i in range(3):
            t.forward(size)
            t.left(120)

    else:
       sierpinski(a-1,t,size/2)
       t.forward(size/2)
       sierpinski(a-1,t,size/2)
       t.forward(size/2)
       t.left(120)
       t.forward(size/2)
       sierpinski(a-1,t,size/2)
       t.forward(size/2)
       t.left(120)
       t.forward(size)
       t.left(120)

sierpinski(3,alex,200)

window.mainloop()

但是,代码能更简洁吗?

编辑

这就足够了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def sierpinski(a, t, size):
    half = size / 2
    if a >= 0:
        sierpinski(a-1, t, half)
        t.forward(half)

        sierpinski(a-1, t, half)
        t.forward(half)
        t.left(120)
        t.forward(half)

        sierpinski(a-1, t, half)
        t.forward(half)
        t.left(120)
        t.forward(size)
        t.left(120)

这是因为两个if end else块都在绘制三角形( else块只是为了移动游标,但仍然是这样),但是else块进行了递归调用。

为了使它更“节奏曲”,你可以把它全部放到一个类中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SierpinskiTurtle(turtle.Turtle):
    def sierpinski(self, depth, size):
        half = size / 2
        if depth >= 0:
            self.sierpinski(depth-1, half)
            self.forward(half)

            self.sierpinski(depth-1, half)
            self.forward(half)
            self.left(120)
            self.forward(half)

            self.sierpinski(depth-1, half)
            self.forward(half)
            self.left(120)
            self.forward(size)
            self.left(120)

alex = SierpinskiTurtle()

alex.sierpinski(3, 200)
票数 1
EN

Stack Overflow用户

发布于 2018-06-02 20:20:04

我们可以用冲压代替绘图使sierpinski()函数更简单、更快。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from turtle import Turtle, Screen

CURSOR_SIZE = 20

def sierpinski(depth, turtle, size):

    turtle.shapesize(size / CURSOR_SIZE)
    turtle.stamp()

    if depth < 1:
        return

    half = size / 2
    circumradius = half * 3 ** 0.5 / 3

    for _ in range(3):
        turtle.forward(circumradius)  # to
        sierpinski(depth - 1, turtle, half)
        turtle.backward(circumradius)  # and fro
        turtle.left(120)

window = Screen()
window.mode('logo')  # make 0 degrees straight up
window.title('Sierpinski')
window.bgcolor('lightblue')

alex = Turtle('triangle')
alex.fillcolor(window.bgcolor())
alex.penup()

sierpinski(3, alex, 300)

alex.hideturtle()
window.mainloop()

这也有一个优点,就是把三角形画在屏幕上,而不是画到一边。通过使光标以圆形的方式在三角形的半径周围移动,而不是在中心来回移动,绘图可以进一步优化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50655768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文