/**
* 递归算法-汉诺塔
* @author admin
*
*/
public class Hanota {
/**
* 汉诺塔:一共三根柱子,要求从第一根柱子将所有的盘子移动到第三根柱子上,移动过程中小盘子在上,大盘在下
* @param n 盘子个数
* @param from 第一根柱子
* @param mid 中间柱子
* @param to 第三根柱子
*/
private int i = 1;
public void hanNota(int n,char from,char mid,char to){
if(n == 1){//如果只有一个盘子,直接将这个盘子移动到从第一根柱子移动到第三根柱子
move(n,from,to);
return;
}
//将(n-1)个盘子看作一个盘子,依赖第三个柱子,从第一根柱子移动到第二根柱子
hanNota(n-1,from,to,mid);
move(n , from,to);//将第n根柱子从第一根柱子移动到第三根
//将n-1个盘子从第二根柱子,依赖第一根柱子,移动到第三根柱子
hanNota(n-1, mid, from, to);
}
private void move(int n, char from, char to) {
System.out.println("第"+i+++"步,从柱子 "+ from+" ---> "+to);
}
public static void main(String[] args) {
Hanota alg = new Hanota();
alg.hanNota(4, 'A', 'B', 'C');
}
}
结果打印:
第1步,从柱子 A —> B
第2步,从柱子 A —> C
第3步,从柱子 B —> C
第4步,从柱子 A —> B
第5步,从柱子 C —> A
第6步,从柱子 C —> B
第7步,从柱子 A —> B
第8步,从柱子 A —> C
第9步,从柱子 B —> C
第10步,从柱子 B —> A
第11步,从柱子 C —> A
第12步,从柱子 B —> C
第13步,从柱子 A —> B
第14步,从柱子 A —> C
第15步,从柱子 B —> C