为什么当 draw 的递归使用 n-1 时,打印输出中的 N 值增加到 2 和 3?

Why does the N value increase to 2 and 3 in the printed output when the recursions of draw use n-1?

我无法理解为什么n值在if语句后总是变成1 returns。此外,如果两个递归都使用 n-1,我不明白 n 值如何增加。有人可以解释这些事件是如何发生的吗?输出中添加了注释以进一步解释问题。

import turtle

bob = turtle.Turtle()
bob.speed(1)

def draw(t, length, n):
    if n == 0:
        print("Return")
        return
    else:
        print('N in if statement =', n)
    angle = 50
    print("Pre forward, n =", n)
    t.fd(length * n)
    print("Pre left turn, n =", n)
    t.lt(angle)
    print("Pre draw 1, n =", n)
    draw(t, length, n-1)
    print("Pre right turn, n =", n)
    t.rt(angle*2)
    print("Pre draw 2, n =", n)
    draw(t, length, n-1)
    print("Pre left turn 2, n =", n)
    t.lt(angle)
    print("Pre backwards, n =", n)
    t.bk(length*n)
    print("Post backwards, n =", n)

draw(bob, 15, 3)




turtle.mainloop()

输出:


N in if statement = 3
Pre forward, n = 3
Pre left turn, n = 3
Pre draw 1, n = 3
N in if statement = 2
Pre forward, n = 2
Pre left turn, n = 2
Pre draw 1, n = 2
N in if statement = 1
Pre forward, n = 1
Pre left turn, n = 1
Pre draw 1, n = 1
Return
Pre right turn, n = 1 # how does n become 1 here after 0 was returned?
Pre draw 2, n = 1
Return
Pre left turn 2, n = 1
Pre backwards, n = 1
Post backwards, n = 1
Pre right turn, n = 2
Pre draw 2, n = 2
N in if statement = 1
Pre forward, n = 1
Pre left turn, n = 1
Pre draw 1, n = 1
Return
Pre right turn, n = 1
Pre draw 2, n = 1
Return
Pre left turn 2, n = 1
Pre backwards, n = 1
Post backwards, n = 1
Pre left turn 2, n = 2
Pre backwards, n = 2
Post backwards, n = 2
Pre right turn, n = 3
Pre draw 2, n = 3 # how is it possible for n to increase from 1 to 3 when both recursions subtract 1 from n?
N in if statement = 2
Pre forward, n = 2
Pre left turn, n = 2
Pre draw 1, n = 2
N in if statement = 1
Pre forward, n = 1
Pre left turn, n = 1
Pre draw 1, n = 1
Return
Pre right turn, n = 1
Pre draw 2, n = 1
Return
Pre left turn 2, n = 1
Pre backwards, n = 1
Post backwards, n = 1
Pre right turn, n = 2
Pre draw 2, n = 2
N in if statement = 1
Pre forward, n = 1
Pre left turn, n = 1
Pre draw 1, n = 1
Return
Pre right turn, n = 1
Pre draw 2, n = 1
Return
Pre left turn 2, n = 1
Pre backwards, n = 1
Post backwards, n = 1
Pre left turn 2, n = 2
Pre backwards, n = 2
Post backwards, n = 2
Pre left turn 2, n = 3
Pre backwards, n = 3
Post backwards, n = 3 # how is it possible for n to increase from 1 to 3 when both recursions subtract 1 from n?

如果我们使用 n 作为调试输出的缩进深度,而不是简单地打印 n 的值,这可能有助于可视化正在发生的事情:

import turtle

def draw(t, length, n):
    if n == 0:
        print('\t'*n, "Return")
        return

    print('\t'*n, "N in if statement =", n)

    angle = 50
    print('\t'*n, "Pre forward, n =", n)
    t.forward(length * n)
    print('\t'*n, "Pre left turn, n =", n)
    t.left(angle)
    print('\t'*n, "Pre draw 1, n =", n)
    draw(t, length, n-1)
    print('\t'*n, "Pre right turn, n =", n)
    t.right(angle*2)
    print('\t'*n, "Pre draw 2, n =", n)
    draw(t, length, n-1)
    print('\t'*n, "Pre left turn 2, n =", n)
    t.left(angle)
    print('\t'*n, "Pre backwards, n =", n)
    t.backward(length * n)
    print('\t'*n, "Post backwards, n =", n)

bob = turtle.Turtle()
bob.speed('slowest')

draw(bob, 15, 3)

turtle.mainloop()

输出

% python3 test.py
             N in if statement = 3
             Pre forward, n = 3
             Pre left turn, n = 3
             Pre draw 1, n = 3
         N in if statement = 2
         Pre forward, n = 2
         Pre left turn, n = 2
         Pre draw 1, n = 2
     N in if statement = 1
     Pre forward, n = 1
     Pre left turn, n = 1
     Pre draw 1, n = 1
 Return
     Pre right turn, n = 1
     Pre draw 2, n = 1
 Return
     Pre left turn 2, n = 1
     Pre backwards, n = 1
     Post backwards, n = 1
         Pre right turn, n = 2
         Pre draw 2, n = 2
     N in if statement = 1
     Pre forward, n = 1
     Pre left turn, n = 1
     Pre draw 1, n = 1
 Return
     Pre right turn, n = 1
     Pre draw 2, n = 1
 Return
     Pre left turn 2, n = 1
     Pre backwards, n = 1
     Post backwards, n = 1
         Pre left turn 2, n = 2
         Pre backwards, n = 2
         Post backwards, n = 2
             Pre right turn, n = 3
             Pre draw 2, n = 3
         N in if statement = 2
         Pre forward, n = 2
         Pre left turn, n = 2
         Pre draw 1, n = 2
     N in if statement = 1
     Pre forward, n = 1
     Pre left turn, n = 1
     Pre draw 1, n = 1
 Return
     Pre right turn, n = 1
     Pre draw 2, n = 1
 Return
     Pre left turn 2, n = 1
     Pre backwards, n = 1
     Post backwards, n = 1
         Pre right turn, n = 2
         Pre draw 2, n = 2
     N in if statement = 1
     Pre forward, n = 1
     Pre left turn, n = 1
     Pre draw 1, n = 1
 Return
     Pre right turn, n = 1
     Pre draw 2, n = 1
 Return
     Pre left turn 2, n = 1
     Pre backwards, n = 1
     Post backwards, n = 1
         Pre left turn 2, n = 2
         Pre backwards, n = 2
         Post backwards, n = 2
             Pre left turn 2, n = 3
             Pre backwards, n = 3
             Post backwards, n = 3