为什么当 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
我无法理解为什么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