|
发表于 2023-10-7 13:08:04
|
显示全部楼层
您的理解有一点混淆。在递归调用时,每次递归都会传入新的参数值,并且在特定条件下停止递归,因此不存在无限循环的情况。
让我们来详细解释一下递归的执行过程:
1. 首先,调用 moveTower(3, 1, 3, 2)。
2. 进入 moveTower 函数,传入参数 (3, 1, 3, 2)。
3. 因为 height >= 1,所以进入递归。
4. 首先调用 moveTower(2, 1, 2, 3)。注意:此处辅助柱和目标柱交换了位置,是因为在本次递归中,辅助柱变成了目标柱,目标柱变成了辅助柱。
5. 进入 moveTower 函数,传入参数 (2, 1, 2, 3)。
6. 再次进行递归调用,调用 moveTower(1, 1, 3, 2)。
7. 进入 moveTower 函数,传入参数 (1, 1, 3, 2)。
8. 因为 height >= 1,所以进行递归调用。
9. 调用 moveTower(0, 1, 2, 3)。注意:在这里,height-1 的值为 0,所以不会继续递归调用。
10. 返回到上一层递归调用 moveTower(1, 1, 3, 2)。
11. 调用 moveDisk(1, 3),输出移动盘子的操作。
12. 再次进行递归调用 moveTower(0, 2, 3, 1)。同样,height-1 的值为 0,不会递归调用。
13. 返回到上一层递归调用 moveTower(2, 1, 2, 3)。
14. 调用 moveDisk(1, 2),输出移动盘子的操作。
15. 再次进行递归调用 moveTower(1, 3, 2, 1)。
16. 进入 moveTower 函数,传入参数 (1, 3, 2, 1)。
17. 同样进行递归调用 moveTower(0, 3, 1, 2),并返回。
18. 调用 moveDisk(3, 2),输出移动盘子的操作。
19. 再次进行递归调用 moveTower(0, 1, 2, 3),并返回。
20. 返回到上一层递归调用 moveTower(3, 1, 3, 2)。
21. 调用 moveDisk(1, 3),输出移动盘子的操作。
22. 再次进行递归调用 moveTower(2, 2, 3, 1)。
23. 进入 moveTower 函数,传入参数 (2, 2, 3, 1)。
24. 同样进行递归调用 moveTower(1, 2, 1, 3),并返回。
25. 调用 moveDisk(2, 3),输出移动盘子的操作。
26. 再次进行递归调用 moveTower(1, 1, 3, 2)。
27. 进入 moveTower 函数,传入参数 (1, 1, 3, 2)。
28. 同样进行递归调用 moveTower(0, 1, 2, 3),并返回。
29. 调用 moveDisk(1, 2),输出移动盘子的操作。
30. 返回到上一层递归调用 moveTower(2, 2, 3, 1)。
31. 调用 moveDisk(3, 1),输出移动盘子的操作。
32. 再次进行递归调用 moveTower(1, 3, 2, 1)。
33. 进入 moveTower 函数,传入参数 (1, 3, 2, 1)。
34. 同样进行递归调用 moveTower(0, 3, 1, 2),并返回。
35. 调用 moveDisk(3, 2),输出移动盘子的操作。
36. 返回到上一层递归调用 moveTower(2, 2, 3, 1)。
37. 再次进行递归调用 moveTower(1, 2, 1, 3),并返回。
38. 调用 moveDisk(2, 3),输出移动盘子的操作。
39. 返回到上一层递归调用 moveTower(3, 1, 3, 2)。
40. 返回到主程序。
所以,通过以上的递归过程,每个递归调用都会返回到上一层,并依次执行后续的代码。不存在无限循环的问题。
希望这样的解释能够清楚地回答您的疑问。如果还有其他问题,请随时提出。
球一个最佳答案谢谢啦!这对我非常重要! |
|