汉诺塔背后的规律

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着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

 

posted @ 2017-04-03 22:25  henu小白  阅读(8553)  评论(0编辑  收藏  举报