汉诺塔问题(Java实现)
程序员文章站
2022-04-25 20:26:05
...
众所周知,汉诺塔是一个经典的递归问题。但我一直对它的递归过程一知半解,可以说就是不怎么懂。今天我到知乎上看到大佬的一句话,很有感触,分享给大家:
对递归的理解的要点主要在于放弃!放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。
品,你细品!
汉诺塔问题归根结底就三步:
1.把 n-1 号盘子移动到辅助杆
2.把1号圆盘从起点移到终点
3.最后把辅助杆的n-1号盘子也移到终点
public class Hanoi {
public static void main(String[] args) {
move(3,'A','B','C');
int sum=count(3);
System.out.println("共搬运"+sum+"次");
}
//模拟汉诺塔的搬运过程
public static void move(int n,char start,char middle,char end){
//start表示起始杆的名称,end表示目标杆名称,middle表示辅助杆名称,n表示待搬运的圆盘数量
if(n==1) {
System.out.println(start + "——>" + end);
return;
}//只有一个盘子时,直接搬到终点一步到位
else{
move(n-1,start,end,middle);//把n-1个盘子移动到辅助杆
System.out.println(start + "——>" + end);//把最大圆盘从起始杆搬到目标杆
move(n-1,middle,start,end);//最后把辅助杆的n-1号盘子也移到终点
}
}
//计算n个圆盘搬运的总次数
public static int count(int n){
if(n==1)
return 1;
else
{
int count1=count(n-1);//把n-1个盘子移动到辅助杆
int count2=1;//把最大圆盘从起始杆搬到目标杆
int count3=count(n-1);//最后把辅助杆的n-1号盘子也移到终点
return count1+count2+count3;
}
}
}
运行结果:
其实n块圆盘总搬运次数有一个公式:count(n)=2^n-1
在这里,我就不细推了