在海龟绘图中绘制树的递归函数

0 投票
1 回答
3060 浏览
提问于 2025-04-18 03:41

我正在尝试用递归函数画一棵树。这是我目前的尝试。我知道自己离目标还有很远,但在修正过程中遇到了困难。希望能得到一些帮助!

def svTree( trunkLength, levels ):
    """ uses the turtle drawing functions to return a tree with a specified number of levels
    input: two integers, trunkLength and levels
    """

    newtrunkLength = trunkLength *.5

    if levels ==1:
           penup()
    else:

        forward(trunkLength)       
        left(45)         
        svTree(trunkLength * 0.5,levels -1)      
        right(90)
        forward(trunkLength *.5)
        svTree(trunkLength * 0.5,levels -1)      
        left(45)          
        backward(trunkLength)

        forward(trunkLength)       
        right(45)
        svTree(trunkLength * 0.5,levels -1)
        left(90)
        svTree(trunkLength * 0.5,levels -1)
        right(45)
        backward(trunkLength)

        return  svTree(newtrunkLength,levels -1)   

这是我新的尝试:我觉得这次更接近了,因为我能画出“Y”形状,但我觉得我的递归步骤有问题……请帮帮我!谢谢!:)

def svTree( trunkLength, levels ):
    """ uses the turtle drawing functions to return a tree with a specified number of levels
    input: two integers, trunkLength and levels
    """

    newtrunkLength = trunkLength *.5

    if levels ==1:
           penup()
    else:

        forward(trunkLength)       
        left(45)         
        forward(trunkLength * 0.5)
        penup()
        backward(trunkLength * 0.5)
        right(90)
        pendown()
        forward(trunkLength *.5)
        penup()
        backward(trunkLength *.5)
        right(180)
        left(45)
        right(180)
        return svTree(newtrunkLength,levels-1)

1 个回答

1

复制粘贴通常说明你在某些地方做错了,应该把重复的部分提取出来。

你很可能不想在后退的时候画东西,所以在调用 backward() 之前,先调用 penup()

另外,你希望所有的子树都从同一个点生长,所以在每次递归调用后,你需要返回到之前的位置。

最后,你从来没有使用返回的值,那么在 return 这一行的递归调用到底想要达到什么呢?

撰写回答