|
发表于 2023-10-7 15:48:57
|
显示全部楼层
在执行递归函数时,Python 会为每个函数调用创建一个新的局部命名空间和一个新的调用堆栈。当递归函数调用自身时,它会将新的参数传递给函数,并在新的命名空间和调用堆栈中执行新的函数。每个递归函数调用都是独立的,因此它们不会相互干扰或导致无限循环。
在执行 moveTower(3,1,3,2) 时,首先会将 height 参数设置为 3,然后调用 moveTower 函数。在该函数中,如果 height>=1,则会执行三行代码:
[/code]
moveTower(height-1, fromPole, withPole, toPole)
moveDisk(fromPole, toPole)
moveTower(height-1, withPole, toPole, fromPole)
[/code]
第一行代码调用 moveTower(2, 1, 2, 3) 并将 height 参数设置为 2。在这个新调用中,又会执行三行代码,包括调用 moveTower(1, 1, 3, 2) 和调用 moveDisk(1, 2)。moveTower(1, 1, 3, 2) 将 height 参数设置为 1,并调用 moveDisk(1, 3)。由于 height 等于 1,这个调用将不会产生任何额外的递归调用,因此程序将执行 moveDisk(1, 3) 和 moveTower(1, 2, 3, 1),然后返回到先前的递归调用。
接下来,递归调用 moveTower(2, 1, 2, 3) 将 height 参数再次设置为 2,并调用 moveTower(1, 1, 2, 3) 和 moveDisk(1, 2)。moveTower(1, 1, 2, 3) 不会产生任何额外的递归调用,因此将执行 moveDisk(1, 2) 和 moveTower(1, 3, 2, 1)。
回到最初的递归调用,现在它将运行 moveTower(2, 2, 3, 1)。这个递归调用将 height 参数设置为 2,并调用 moveTower(1, 2, 1, 3) 和 moveDisk(2, 3)。moveTower(1, 2, 1, 3) 将 height 设置为 1,并调用 moveDisk(2, 1)。这个递归调用完成后,程序将继续执行 moveDisk(2, 3) 和 moveTower(1, 1, 3, 2)。
最后,回到最初的递归调用,现在它将运行 moveTower(3, 2, 3, 1)。这个递归调用将 height 参数设置为 3,并调用 moveTower(2, 2, 1, 3) 和 moveDisk(3, 1)。moveTower(2, 2, 1, 3) 将 height 设置为 2,并调用 moveTower(1, 2, 3, 1) 和 moveDisk(2, 1)。这个递归调用完成后,程序将继续执行 moveDisk(3, 1) 和 moveTower(2, 3, 1, 2)。
通过上述过程可以看出,在递归函数中,每次递归调用都会独立创建自己的命名空间和调用堆栈,不会相互干扰或导致无限循环。
关于图表表示:可以使用一个栈来追踪函数调用和返回。当 moveTower() 被调用时,将 height、fromPole、toPole 和 withPole 压入栈中。每当递归调用函数时,也将这些参数压入栈中。当函数返回时,从栈中弹出参数并恢复先前的状态。
球一个最佳答案谢谢啦!这对我非常重要! |
|