c++设计递归算法解决汉诺塔问题
时间: 2023-07-31 20:09:35 浏览: 51
好的,汉诺塔问题是一个经典的递归问题。假设有三个柱子A、B、C,A柱子上有n个不同大小的盘子,从上到下依次递减。现在需要将所有盘子从A柱子移动到C柱子,可以借助B柱子,但要满足以下三个条件:一次只能移动一个盘子,大盘子不能放在小盘子上面,借助的B柱子必须保持盘子的有序性。那么,递归算法解决汉诺塔问题的步骤如下:
1. 若n=1,则将盘子从A柱子直接移动到C柱子。
2. 若n>1,则将A柱子上的n-1个盘子先借助C柱子移动到B柱子上,然后将A柱子上剩余的一个盘子移动到C柱子上,再将B柱子上的n-1个盘子借助A柱子移动到C柱子上。
根据以上步骤,C++代码如下:
```c++
#include <iostream>
using namespace std;
// 将编号为no的盘子从from移动到to
void move(int no, char from, char to)
{
cout << "Move disk " << no << " from " << from << " to " << to << endl;
}
// 将n个盘子从from移动到to,借助mid柱子
void hanoi(int n, char from, char to, char mid)
{
if (n == 1)
{
move(1, from, to);
}
else
{
hanoi(n - 1, from, mid, to);
move(n, from, to);
hanoi(n - 1, mid, to, from);
}
}
int main()
{
int n = 3; // 三个盘子
hanoi(n, 'A', 'C', 'B'); // 将三个盘子从A柱子移动到C柱子,借助B柱子
return 0;
}
```
输出结果如下:
```
Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C
```
阅读全文