汉诺塔问题递归求解

一、问题描述
 如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数。
 汉诺塔问题递归求解_第1张图片
 
二、移动次数 规律查找
(1)n==1
第1次 1号盘 A—->C sum = 1 次
( 2 ) n==2
第1次 1号盘 A—->B
第2次 2号盘 A—->C
第3次 1号盘 B—->C sum = 3 次
(3)n ==3
第1次 1号盘 A—->C
第2次 2号盘 A—->B
第3次 1号盘 C—->B
第4次 3号盘 A—->C
第5次 1号盘 B—->A
第6次 2号盘 B—->C
第7次 1号盘 A—->C sum = 7 次
发现规律:1个圆盘的次数 2的1次方减1
2个圆盘的次数 2的2次方减1
3个圆盘的次数 2的3次方减1
……………………….
n个圆盘的次数 2的n次方减1
故:移动次数为:2^n - 1

三、算法简述
可以简单分为三个步骤:
(1) 把n-1个盘子由A 移到 B;
(2) 把第n个盘子由 A移到 C;
(3) 把n-1个盘子由B 移到 C;
四、具体代码
class Han{
public static void main(String[]args){
String A=”柱子A”;
String B=”柱子B”;
String C=”柱子C”;
int num=3;// 盘子的个数
han(num,A,B,C);
int sum=1;
for(int i=1;i<=num;i++)
{
sum*=2;
}
System.out.println(“移动了”+(sum-1)+”次,把A上的圆盘都移动到了C上”);

}
public static void han(int num,String A,String B,String C){
if(num==1){
System.out.println(“将”+num+”从”+A+”移动到”+C);
}else{
han(num-1,A,C,B);// 将前num-1个盘子从A移动到中间B 经过C
System.out.println(“将”+(num)+”从”+A+”移动到”+C);// 将第最后一个盘子从A–>C
han(num-1,B,A,C);// 将前num-1个盘子从中间B移动到C 经过A
}
}
}

五、运行结果
汉诺塔问题递归求解_第2张图片

你可能感兴趣的:(JAVA)