I do not understand what happens after the completion of the final step (that is, t.backward(branchlen)).
什么也不会发生;您只需返回到您的调用者,然后在tree调用之后的行继续。在
当然,因为这是一个递归函数,您的调用方通常是tree的另一个实例(除非您一直处于堆栈的顶部)。在How does the value of the variable branchlen change after this step?
没有,但是tree的每个实例都有自己的局部变量。在
例如,让我们从顶部开始。在
首先,我们打电话,说tree(25, t)。在这里,branchLen是25。在
现在,它执行t.forward(25)和{}。然后它会tree(25-15, t)。这是对tree的新调用,在这个新调用中,branchLen是{}。在
所以,这个新调用执行t.forward(10)和{}。然后它会tree(10-15, t)。这是对tree的新调用,在这个新调用中,branchLen是{}。因此新调用立即返回,因为if失败,我们返回到branchLen是{}的调用。它执行t.left(40),然后调用tree(10-10, t)。再一次,一个新的调用,其中branchLen是0,它立即返回,所以我们回到这个调用中,branchLen是{}。我们做t.right(20),然后t.backward(10),然后返回。在
现在我们回到外部调用,其中branchLen是25。它继续使用t.left(40),然后调用tree(25-10, t)。这又是对tree的新调用,但是时间branchLen是15,而不是{}。所有的东西都和最后一段差不多,所以我不再重复它,最后是那个调用返回。在
现在我们回到外部调用,其中branchLen又是25。它继续执行t.right(20),然后t.backward(25),然后完成,然后返回。在
既然我们的顶级代码调用了它,我们就完成了。在
如果递归仍在困扰您,让我们制作一个非递归版本,它只执行2个步骤,而不是N个步骤:def tree(branchLen,t):
if branchLen > 5:
t.forward(branchLen)
t.right(20)
little_tree(branchLen-15,t)
t.left(40)
little_tree(branchLen-10,t)
t.right(20)
t.backward(branchLen)
def little_tree(littleBranchLen,lt):
if littleBranchLen > 5:
lt.forward(littleBranchLen)
lt.right(20)
lt.left(40)
lt.right(20)
lt.backward(littleBranchLen)
现在应该很明显,当tree第一次调用little_tree时,它返回到tree中的t.left(40)行。在