用递归和非递归算法分别求解汉诺塔问题
这里首先声明,作者只理解了递归算法,非递归算法是用ai生成的
- 汉诺塔问题的递归算法
先分成两种情况:
1.如果这个塔只含有一个盘子,则直接将盘子移动到目标盘
2.如果这个塔含有n个盘子,那么将问题从“将最大的盘子n通过辅助柱移动到目标柱”
转化为“将次大的盘子n-1通过辅助柱移动到目标柱”
然后对于情况二,算法步骤为:
将n-1个盘子从起始柱移动到辅助柱
将最大的盘子从起始柱移动到目标柱
将n-1个盘子从辅助柱移动到目标柱
- 递归算法的代码实现
1 | void hanoi1(int n, char from, char to, char dest) { |
- 汉诺塔问题的非递归算法
汉诺塔问题的非递归算法需要借助堆栈来实现
用三个堆栈代表三个柱子,然后根据盘子数量的奇偶性来决定盘子第一步的移动方向
偶数个盘子:起始柱->辅助柱, 起始柱->目标柱, 辅助柱->目标柱
奇数个盘子:起始柱->目标柱, 起始柱->辅助柱, 目标柱->辅助柱
- 非递归算法的代码实现
定义堆栈
1 | typedef int elemtype; |
堆栈初始化
1 | Stack* createStack(int maxsize) { |
移动盘子的辅助函数
1 | void moveDisk(Stack* stacks[], int fromIdx, int toIdx, char fromChar, char toChar, char auxChar) { |
非递归算法实现
1 | void hanoi2(int n, char from, char to, char aux) { |
main函数
1 | int main() { |
- 运行结果(递归算法和非递归算法的结果相同)
1 | 请输入汉诺塔的盘子数量:4 |