使用递归绘制雪花

Drawing a snowflake using recursion

我想创建这样的输出:

我必须使用递归。

到目前为止,我的代码是这样的:

from turtle import *


    def drawFlake(length,depth):
    
        fd(length)
        input("first line done")
        if depth>0:
    
    
            left(60)
            drawFlake(length/3,depth-1)
    
            input("1")
            left(120)
            drawFlake(length/3,depth-1)
            input("2")
    
            left(120)
            drawFlake(length/3,depth-1)
            input("3")
    
            left(120)
            drawFlake(length/3,depth-1)
            input("4")
    
            left(120)
            left(180)
            #drawFlake(length/3,depth-1)
            input("1")
    
            left(120)
            drawFlake(length/3,depth-1)
    
            input("THIS IS THE LAST")
            left(60)
    
    
    
        left(180)
        fd(length)


drawFlake(100,3)

这会产生这样的输出(此处,N =3)

问题是左边那条长线。不应该排长队。相反,应该有另一种片状图案

我做错了什么?

编辑::

这是我设法想出的更好的东西。但它仍然不完美:

def doFigure(length,depth):

        left(120)
        fd(length)
        if depth>1:
         doFigure(length/3,depth-1)

        bk(length)
        right(60)

        fd(length)
        if depth>1:
         doFigure(length/3,depth-1)
        bk(length)
        right(60)

        fd(length)
        if depth>1:
         doFigure(length/3,depth-1)
        bk(length)
        right(60)

        fd(length)
        if depth>1:
         doFigure(length/3,depth-1)
        bk(length)
        right(60)

        fd(length)
        if depth>1:
         doFigure(length/3,depth-1)
        bk(length)
        right(60)

        fd(length)
        if depth == 3:

            doFigure(length/3,depth-1)
        bk(length)
        right(180)

注意倒数第 5 行。我必须对值 3 进行硬编码才能获得正确的值。

这是一个解决方案:它并不完美,因为与您发布的图纸相比,它的主干上多了一束。

让我知道这是否适合你。

从海龟导入 *

def drawFlake(length, depth):
    "draws a flake"
    if depth > 0:
        for _ in range(6):
            forward(length)
            drawFlake(length // 3, depth - 1)
            backward(length)
            left(60)

drawFlake(200,4)

几天后,我想出了一个解决办法。这绝对不是最好的解决方法(如果有更多人发布他们的解决方案,我会很高兴),但它确实显示了与我的原始图片完全一样的输出。

def makeFlake(length,depth,isRoot=True):
    """
    This function draws the flakes. To draw the smaller flakes, this function is called recursively
    :param length: the length of the biggest flake's branch
    :param depth: The number of smaller flakes to draw
    :param isRoot: Draw an extra branch if the value is true. Note that true is the default value. 
    """
    if depth>0:
        forward(length)
        makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

        forward(length)
        makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

        forward(length)
        makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

        forward(length)
        if isRoot == True:
         makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

        forward(length)
        makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

        forward(length)
        makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

如果您想完全按照图片绘制,则必须跳过 6 个辐条中最里面的第 4 个雪花(即从 0 到 5 的循环中跳过每个“3”)

这是一个代码

import turtle as t

#assigning random value for outer at the start, this will be changed later
OUTER=-1
LEN=300
def drawSnowflake(N,LEN):
    if N<0:
        return
    for i in range(6):
        t.forward(LEN)
        #skipping every 4th spoke but not for the level N
        if i==3 and N!=OUTER:
            pass
        else:
            drawSnowflake(N-1,LEN/4)
        t.backward(LEN)
        t.left(60)



def main():
    N=int(input("Enter a max value of N"))
    global OUTER
    OUTER=N
    t.speed(0)
    drawSnowflake(N,LEN)
    t.exitonclick()


if __name__=="__main__":
    main()

我喜欢@amipro (+1) 的解决方案,除了它会透支现有线路(效率稍低,请仔细看。)而且我也更喜欢您在自己的解决方案 (+1) 中标记根异常的方式。所以,这是我自己的解决方案,我希望它能体现两者的优点:

from turtle import *

def makeFlake(length, depth, isRoot=True):

    if depth > 0:
        for branch in range(6):
            if isRoot or branch != 3:
                forward(length)
                makeFlake(length / 3, depth - 1, False)
                backward(length)

            left(60)

tracer(False)  # because I have no patience
makeFlake(100, 4)
tracer(True)

hideturtle()

exitonclick()