无法理解此递归乌龟python代码

发布于 2021-01-29 15:02:53

这是我第一次问问题,希望你们中的一些人有时间回答。

因此,我的目标是使用turtle模块编写一个python脚本来编写毕达哥拉斯树。

我已经花了几天时间,但确实无法超越某个特定点,因此我在网上寻找帮助。我找到了可以满足我的要求的代码,但是只包含很少的代码行:

import turtle
t = turtle.Pen()




LIMIT  =11
SCALAR = 0.5 * (2 ** 0.5)


def drawTree(size, depth):

    drawSquare(size)

    if depth + 1 <= LIMIT:

        t.left(90)
        t.forward(size)
        t.right(45)
        drawTree(size * SCALAR, depth + 1)

        t.forward(size * SCALAR)
        t.right(90)
        drawTree(size * SCALAR, depth + 1)

        t.left(90)
        t.backward(size * SCALAR)
        t.left(45)
        t.backward(size)
        t.right(90)



def drawSquare(sideLength):

    for i in range(4):
        t.forward(sideLength)
        t.left(90)



t.up(); t.goto(-100, -200); t.down()
drawTree(170.0, 0)

因此,我理解大多数代码,但“
if”的第二和第三段除外:为什么要执行它们?如果函数不断重复自身,它将永远无法正常到达该点!我确定我在这里确实缺少一些简单的东西,希望大家都理解我的问题:)再次感谢!

关注者
0
被浏览
125
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    drawTree功能不保留自称永远递归调用所以最终的陈述后
    得到执行。当depth==处的递归调用LIMIT返回时,控制权将返回到上一个调用depth= = LIMIT-1

    这是代码的略微修改版本,并print引发了一些调用以帮助跟踪执行。

    我还做了其他一些小的更改。我简化了SCALAR计算:0.5 * sqrt(2)==
    sqrt(0.5),仅在乌龟实际绘制正方形时才放下笔。我还添加了一个turtle.mainloop()呼叫,以便在绘图完成后窗口保持打开状态。

    from __future__ import print_function
    import turtle
    
    LIMIT = 3
    SCALAR = 0.5 ** 0.5
    INDENT = ' ' * 4
    
    def drawTree(size, depth, branch):
        print(INDENT * depth, branch, depth, 'start')
    
        drawSquare(size)
    
        if depth + 1 <= LIMIT:
    
            t.left(90)
            t.forward(size)
            t.right(45)
            drawTree(size * SCALAR, depth + 1, 'left ')
    
            t.forward(size * SCALAR)
            t.right(90)
            drawTree(size * SCALAR, depth + 1, 'right')
    
            t.left(90)
            t.backward(size * SCALAR)
            t.left(45)
            t.backward(size)
            t.right(90)
    
        print(INDENT * depth, branch, depth, 'stop')
    
    
    def drawSquare(sideLength):
        t.down()
        for i in range(4):
            t.forward(sideLength)
            t.left(90)
        t.up()
    
    
    t = turtle.Pen()
    t.up() 
    t.goto(-100, -200)
    drawTree(100.0, 0, 'root')
    
    turtle.mainloop()
    

    输出

     root 0 start
         left  1 start
             left  2 start
                 left  3 start
                 left  3 stop
                 right 3 start
                 right 3 stop
             left  2 stop
             right 2 start
                 left  3 start
                 left  3 stop
                 right 3 start
                 right 3 stop
             right 2 stop
         left  1 stop
         right 1 start
             left  2 start
                 left  3 start
                 left  3 stop
                 right 3 start
                 right 3 stop
             left  2 stop
             right 2 start
                 left  3 start
                 left  3 stop
                 right 3 start
                 right 3 stop
             right 2 stop
         right 1 stop
     root 0 stop
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看