题目:
汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
把一个大象装进冰箱需要三步
- 打开冰箱门
- 把大象放进去
- 关上冰箱门
如果要知道X个圆盘从初位置到末位置,则也可以分成三步
- 把除了最大的X-1个圆盘移动到中间位置
- 把最大的圆盘移动到末位置
- 把之前的X-1个圆盘移动到末位置
因为每次只能移动一个圆盘,所以X-1个圆盘就是所谓的“大象”,
把X-1个圆盘当作新的"X";
重复上面三步。
可以抽象出函数
ans=f(X):
ans=f(X-1)+1+f(X-1) ——>ans=2f(X-1)+1;
ans=(f(X-2)+1+f(X-2))+1+(f(X-2)+1+f(X-2)) ——>ans=2f(f(X-2)+1+f(X-2))+1;——>ans=2f(2f(X-2)+1)+1;
ans=2f(2f(…(2*f(1)+1)…)+1)+1;
当X=1时f(X)==1;即f(1)=1;
ans=2^(X)-1;
package Two;
import java.util.Scanner;
public class 汉诺塔I {
public static double f(int n,int from,int mid,int to){
if(n==1)return 1;
else return f(n-1,from,to,mid)+1+f(n-1,mid,from,to);
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
//输入圆盘的个数
int n=sc.nextInt();
//公式解法
double ans1=(Math.pow(2, n)-1);
System.out.println(ans1);
//递归解法
double ans2=f(n,1,2,3);
System.out.println(ans2);
}
}
}