一个简单的递归算法,逻辑是很清晰了,例子是网上找的,怕新人看不懂,加了点注释。
public class Main {
public static void main(String[] args){
int i=3;
char a ='A',b='B',c='C';
cdt(i,a,b,c);
}
/**
* 层叠塔
*/
public static void cdt(int n,char a,char b,char c){
System.out.println(n + " 入口");
if(n==1)
System.out.println("移动"+n+"号盘子从"+a+"到"+c + " n=1的轮询");
else{
//把上面n-1个盘子从a借助b搬到c 入口1
cdt(n-1,a,c,b);
System.out.println(n + " 第一轮通过");
System.out.println("移动"+n+"号盘子从"+a+"到"+c + " n!=1的轮询");
//紧接着直接把n搬动c,再把b上的n-1个盘子借助a搬到c 入口2
cdt(n-1,b,a,c);
System.out.println(n + " 结束");
}
}
}
执行结果
3 入口 第一次进入层叠塔方法
2 入口 从入口1进入层叠塔方法,主任务进入等待,开启次任务
1 入口 从入口1再次进入层叠塔方法,
移动1号盘子从A到C n=1的轮询 第一轮顺利结束
2 第一轮通过 次任务通过第一轮
移动2号盘子从A到B n!=1的轮询
1 入口 从入口2进入层叠塔方法
移动1号盘子从C到B n=1的轮询 满足条件后跳出,继续执行次任务
2 结束 次任务结束,主任务开始继续执行
3 第一轮通过 主任务通过第一轮
移动3号盘子从A到C n!=1的轮询
2 入口 主任务从入口2再次进入层叠塔方法,再次开启次任务
1 入口 次任务开始进入
移动1号盘子从B到A n=1的轮询 第一轮顺利结束
2 第一轮通过 次任务通过第一轮
移动2号盘子从B到C n!=1的轮询
1 入口 从入口2进入层叠塔方法
移动1号盘子从A到C n=1的轮询 满足条件后跳出,继续执行次任务
2 结束 次任务结束,主任务继续执行
3 结束 主任务结束