汉诺塔问题算法
以下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数code
1个盘的时候,只须要移动1次便可达成目标,g(1) = 1
)(步骤一)blog
2个盘的时候,须要移动3次便可达成目标,g(2) = 3
(步骤二)递归
3个盘的时候,咱们须要将底下较大的两个盘先移动到C中,以后再将A中剩下的那个盘移动到C中。im
这里须要注意的是,咱们是将底下的2个盘当作了一个,因此是至关于进行了2次步骤二须要2*g(2)次
next
以后就是步骤一的那种状况 ,须要1次移动
static
g(3)=2*g(2)+1
img
通式为g(n)=2*g(n-1)+1
移动
递归出口为n=1
co
System.out.println("请输入盘片数:"); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.close(); long result = han(n); System.out.println("总移动次数为"+result); } public static long han(int n){ long s; if(n==1){ s=1; }else{ s =2*han(n-1)+1; } return s; }