漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。
大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。
大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上(可以借助第三根柱子做緩沖)。
並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
64個圓盤太多了,所以減為7個,
金剛石和黃金都以木頭代替了......但道理是相同的。
據說完成大梵天的命令需要太多的移動次數,以至被認為完成之時就是世界末日!
你的任務是精確計算出到底需要移動多少次。
很明顯,如果只有2個圓盤,需要移動3次。
圓盤數為3,則需要移動7次。
那么64個呢?
傳統的漢諾塔:3個圓盤在3個柱子上移動
運用遞歸
public class 漢諾塔 {
static int count=0;
public static void main(String[] args) {
fun(3,'A','B','C');
System.out.println(count);
}
public static void fun(int n,char a,char b,char c){
if(n==1){
count++;
System.out.println(a+"->"+c);
return;
}
fun(n-1,a,c,b);
count++;
System.out.println(a+"->"+c);
fun(n-1,b,a,c);
}
}
count用來計數,可以發現規律移動的次數為(2的n次方-1)次
算64個圓盤總共需要移動多少次,用long存不下,需要用Java中BigDecimal類或者BigInteger類來存儲
import java.math.BigDecimal;
public class 益智游戲 {
//2的64次方減一
public static void main(String[] args) {
BigDecimal bd=BigDecimal.ONE.add(BigDecimal.ONE);
System.out.println(bd.pow(64).subtract(BigDecimal.ONE));
}
}
運行結果為:18446744073709551615