我试图理解递归函数,它们看起来非常复杂。到目前为止,我唯一了解到的是,他们需要的是一个基本案例,这是基于归纳的证据。到目前为止,程序员是如何看待简单的基本情况的。在一本书中,只使用一行基本案例解决了分形问题。在Sierpinski三角形中,我需要这么多行代码。好吧,现在我离它很近了,但仍然遥不可及。下面是适用于订单0和1的代码,但是对于更高的订单,它增加了更多的空间。我知道这不是弦乐密码,但那是我能写的最好的。
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()
是的,有点长,我的思维过程还不清楚。
发布于 2018-06-02 02:32:49
好的,我找到了如何在视频的帮助下做这件事,它指示我把它分成两半,而不是三分之一。
所以代码应该是
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()
但是,代码能更简洁吗?
编辑
这就足够了:
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
块进行了递归调用。
为了使它更“节奏曲”,你可以把它全部放到一个类中:
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)
发布于 2018-06-02 20:20:04
我们可以用冲压代替绘图使sierpinski()
函数更简单、更快。
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()
这也有一个优点,就是把三角形画在屏幕上,而不是画到一边。通过使光标以圆形的方式在三角形的半径周围移动,而不是在中心来回移动,绘图可以进一步优化。
https://stackoverflow.com/questions/50655768
复制相似问题