使用递归绘制分形

时间:2018-11-30 12:02:58

标签: python recursion turtle-graphics fractals

最近我开始学习递归,我发现有一种叫做分形的东西,我用它做了一棵简单的树。

但是我对分形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)

2 个答案:

答案 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的左下角

完成后,我们将再次回到指向原始方向的中心,因此我们再次重复了整个过程,但是通过取反角度将所有权利转为左侧,反之亦然。这将绘制我们的左下腿,然后以右上腿结束。

enter image description here