2^n - 1:代表有n个盘子需要移动的次数
可以知道当盘子的个数较多的时候,移动的次数会迅速增加
1、当只有一个盘子的时候,直接从第一个盘子移动到第三个盘子
public static void move (char pos1, char pos3) {
System.out.print(pos1 + " -> " + pos3 + " ");
}
2、当有n个盘子的时候,将n-1个盘子通过第三个底座全部移到第二个底座上,然后将最后一个盘子移动到第三个底座上,最后将n-1个盘子通过第一个底座移动到第三个底座上。
public static void hanNoTa (int n, char pos1, char pos2, char pos3) {
if (n ==1) {
move(pos1, pos3);
return;
} else {
hanNoTa(n-1, pos1, pos3, pos2); //pos1 上的n-1个盘子通过pos3移到pos2上
move(pos1,pos3);
hanNoTa(n-1,pos2,pos1,pos3);
}
}
完整测试代码
public class TestDemo {
public static void main(String[] args) {
hanNoTa(3,'A','B','C');
System.out.println();
hanNoTa(2,'A','B','C');
System.out.println();
}
public static void move (char pos1, char pos3) {
System.out.print(pos1 + " -> " + pos3 + " ");
}
/**
*
* @param n: 代表盘子的个数
* @param pos1:代表底座
* @param pos2:代表底座
* @param pos3:代表底座
*/
public static void hanNoTa (int n, char pos1, char pos2, char pos3) {
if (n ==1) {
move(pos1, pos3);
return;
} else {
hanNoTa(n-1, pos1, pos3, pos2); //pos1 上的n-1个盘子通过pos3移到pos2上
move(pos1,pos3);
hanNoTa(n-1,pos2,pos1,pos3);
}
}
}
结果
A -> C A -> B C -> B A -> C B -> A B -> C A -> C
A -> B A -> C B -> C