用递归绘制分形

2024-04-30 02:10:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但是我有一个问题,关于这个分形的递归概念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)

Tags: httpscom算法概念pngdefstartlength
2条回答

分形的基本形状是一个大字母“H”,在它的四个尖端各有一个较小的版本。所以你基本上要做的就是在turtle中画一个“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)

你也可以利用这个事实,即图的两边是对称的:

^{pr2}$

虽然不是最快的实现,但它结构紧凑,让您不断猜测下一步的发展方向:

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

相关问题 更多 >