最近我开始学习递归,我发现有一种叫做分形的东西,我用它做了一棵简单的树。
但是我对分形https://i.imgur.com/RMPfwU2.png的递归概念有疑问
我看到了类似的东西,但是是用正方形制成的。
任何人都可以解释这一递归思想吗? 我用Python(turtle)尝试了这个算法
def fractal(start,length,direction,t):
if(length < 10):
return
t.rt(direction)
direction = int(direction/360) # To make it only {90,-90}
t.fd(length)
fractal(start+length,length/2,direction+90,t)
fractal(start+length,length/2,direction-90,t)
t.lt(direction)
fractal(start+length,length/2,direction+90,t)
fractal(start+length,length/2,direction-90,t)
答案 0 :(得分:0)
分形的基本形状是一个大字母“ H”,其四个尖头均带有较小的字母。因此,您基本上要做的是在乌龟上绘制一个“ H”,然后在提示时,以一半的长度再次调用fractal
。请记住,在函数启动时,乌龟应始终朝着相同的方向定向,并且在绘制形状后必须返回原点。该函数可能看起来像这样:
def fractal(length, t):
if length >= 10 :
# draw left side
t.lt(90)
t.fd(length)
t.rt(90)
t.fd(length)
fractal(length//2, t)
t.bk(length*2)
fractal(length//2, t)
t.fd(length)
# draw right side
t.rt(90)
t.fd(length*2)
t.lt(90)
t.fd(length)
fractal(length//2, t)
t.bk(length*2)
fractal(length//2, t)
t.fd(length)
# back to origin
t.lt(90)
t.fd(length)
t.rt(90)
您还可以使用te图形的两侧对称的事实:
def fractal(length, t):
if length >= 10:
t.rt(90)
side(length, t)
t.rt(180)
side(length, t)
t.rt(90)
def side(length, t):
t.fd(length)
t.rt(90)
t.fd(length)
fractal(length//2, t)
t.bk(length*2)
fractal(length//2, t)
t.fd(length)
t.lt(90)
t.bk(length)
答案 1 :(得分:0)
不是最快的实现,但它紧凑,可让您猜测下一步的发展:
from turtle import Screen, Turtle
def fractal(turtle, length, minimum):
if length < minimum:
return
angle = 90
length //= 2
for _ in range(2):
for _ in range(2):
turtle.forward(length)
turtle.left(angle)
turtle.forward(length)
turtle.left(angle)
fractal(turtle, length, minimum)
turtle.left(angle)
turtle.forward(length)
turtle.right(angle)
turtle.forward(length)
angle = -angle
screen = Screen()
yertle = Turtle()
yertle.speed('fastest') # because I have no patience
fractal(yertle, 100, 10)
screen.exitonclick()
首先,我们向H的右上角绘制路线,向内转向并递归。一旦完成递归,我们将继续朝着相同的方向旋转以向下移动手臂。而不是一直沿着手臂移动(做高效的事情),我们回到起点,但是现在我们正面临相反的方向,因此我们只需重复到现在为止所做的所有操作以绘制H的左下角
完成后,我们将再次回到指向原始方向的中心,因此我们再次重复了整个过程,但是通过取反角度将所有权利转为左侧,反之亦然。这将绘制我们的左下腿,然后以右上腿结束。