先上图,看图比较容易理解:
idea:
如果想要把x柱上面的n个盘子移到y柱上,
-
我们需要先把x柱子上的n-1个盘子先整体移到z柱暂存;
- 然后第n个盘子从x柱移到y柱上;
- 最后将z柱上的n-1个盘子移到y柱上。
我们在把第1个过程进行拆分:
1.1 将x柱子上的n-2 个盘从移到y柱上暂存。
1.2 然后第n-1个盘子从x柱移到z柱上;
1.3 最后将y柱上的n-2个盘子移到z柱上
我们在把第3个过程进行拆分:
3.1 将z柱子上的n-2 个盘从移到x柱上暂存。
3.2 然后第n-1个盘子从z柱移到y柱上;
3.3 最后将x柱上的n-2个盘子移到y柱上
....
可以继续对1.1 1.3 3.1 3.3这四个过程安装上面的方法拆分,这里就不给出了;
慢慢地我们就可以发现规律,移动n个盘子的过程中肯定包含了移动n-1个盘子的过程;(典型的递归问题)
我们现在已经知道了这个过程的规律,那么就要考虑边界问题了:
当需要移动的盘子数量不为零,我们就不能停,那当盘子数量为0时,就可以停止
....
现在,我们来用代码来实现一下(C++)
#include <stdio.h>
#include <iostream>
using namespace std;
void move (int n,char A,char B)
{
cout<<"move "<<n<<" from "<<A<<" to "<<B<<endl;
}
void hanio(int n, char x, char y, char z) // 这个函数的执行目的: 将n个盘子从x柱移到y柱。z是用来中转的
{
if(n){
hanio(n - 1, x, z, y); // ① 我们需要先把x柱子上的n-1个盘子先整体移到z柱暂存;
move(n, x, y); // ② 然后第n个盘子从x柱移到y柱上
hanio(n - 1, z, y, x); // ③ 最后将z柱上的n-1个盘子移到y柱上。
}
}
int main()
{
hanio(5,'A','B','C');
}