鱼C论坛

 找回密码
 立即注册
查看: 2628|回复: 2

递归问题

[复制链接]
发表于 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. 返回到主程序。

所以,通过以上的递归过程,每个递归调用都会返回到上一层,并依次执行后续的代码。不存在无限循环的问题。

希望这样的解释能够清楚地回答您的疑问。如果还有其他问题,请随时提出。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-13 04:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表