版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20009015/article/details/83894105
package stack.demo;
/**
* 汉诺塔问题:
* 假设有三根柱子,x y z
* x上有3个圆盘,从底部开始从大到小编号为n 到 1
* 若每次只能移动一个圆盘,且大圆盘不能在小圆盘上面
* 现在需要将3个圆盘 都从x柱子上都移动到z柱子上,且保持原来的顺序,
* 需要移动多少次? 若是n个圆盘呢?
*/
public class Hanoi {
private static int num=0;//计数器
/**
* @param x 起始柱子
* @param y 辅助柱子
* @param z 目的柱子
* @param n 盘子个数
*/
public static void HanoiExcute(char x, char y, char z, int n) {
//如果要把n个盘子都放到z上,那么需要把n-1到1个盘子都放到y上,然后把第n个盘子放到z上,再把n-1到1个盘子都放到z上
if (n==1){
move(x,z,1);//将第1个盘子 从x移动到z
}else {
//将n-1到1之间的所有盘子从x移动到y
HanoiExcute(x,z,y,n-1);
move(x,z,n);//将第n个盘子从x移动到z
//将n-1到1之间到所有盘子从y移动到z
HanoiExcute(y,x,z,n-1);
}
}
/**
* @param a 起始柱子
* @param b 目的柱子
* @param n 盘子编号
*/
public static void move(char a, char b, int n){
num++;
System.out.println("第"+num+"次移动,将盘子"+n+"从"+a+"移动到"+b);
}
public static void main(String[] args) {
char x='x';
char y='y';
char z='z';
int n=30;
HanoiExcute(x,y,z,n);
}
}
输出结果
第1次移动,将盘子1从x移动到z
第2次移动,将盘子2从x移动到y
第3次移动,将盘子1从z移动到y
第4次移动,将盘子3从x移动到z
第5次移动,将盘子1从y移动到x
第6次移动,将盘子2从y移动到z
第7次移动,将盘子1从x移动到z
ps:汉诺塔问题的数学递归式子得到的时间复杂度为
2的n次方-1
经典的递归题目,要点在于两点。
1.HanoiExcute(char x, char y, char z, int n)
这个方法的目的,就是将x上的n个圆盘按原本 的顺序从x移动到z上,y作为辅助柱子。参数含义为x是起始柱子,y是辅助柱子,z是目标柱子,n为圆盘个数。
递归的核心就是要定义好要递归的函数定义。
2.move(char a, char b, int n)
这个方法的目的是,从a柱子上将编号为n的圆盘移动到b柱子上。参数含义为,a为起始柱子,b为目标柱子,n为圆盘编号
源码的github地址,可以下载到本地运行