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

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上(可以借助第三根柱子做缓冲)。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
如图【1.jpg】是现代“山寨”版的该玩具。64个圆盘太多了,所以减为7个,
金刚石和黄金都以木头代替了…但道理是相同的。
据说完成大梵天的命令需要太多的移动次数,以至被认为完成之时就是世界末日!
你的任务是精确计算出到底需要移动多少次。
很明显,如果只有2个圆盘,需要移动3次。
圆盘数为3,则需要移动7次。
那么64个呢?
答案写在“解答.txt”中,不要写在这里!
*/

import java.math.BigDecimal;

public class llq1{
	public static void hanio(int n,char a,char b,char c) {
		if(n>0) {
			hanio(n-1,a,c,b);
			hanio(n-1,b,a,c);
			s++;
		}
	}
	static long s=0;
	public static void main(String[] args) {
		int n=10;
		System.out.println("圆盘个数\t移动次数");
		for(int i=1;i<=n;i++) {
			s=0;
			hanio(i,'a','b','c');
			System.out.println(i+"->\t"+s);
		}
		System.out.println("由上找到规律:移动次数=2^n-1");
		System.out.println("64个圆盘移动次数为\n");
		BigDecimal bi=new BigDecimal("2");
		bi=bi.pow(64).subtract(BigDecimal.ONE);
		System.out.println(bi);
	}
}

结果:
圆盘个数 移动次数
1-> 1
2-> 3
3-> 7
4-> 15
5-> 31
6-> 63
7-> 127
8-> 255
9-> 511
10-> 1023
由上找到规律:移动次数=2^n-1
64个圆盘移动次数为

18446744073709551615

补充:

public class llq1{
	static int  s=0;
	public static void main(String[] args) {
		hanio(3,'a','b','c');
		System.out.print(s);
	}
	static void hanio(int n,char a,char b,char c) {
		if(n>0) {hanio(n-1,a,c,b);
		move(a,c);
		hanio(n-1,b,a,c);
		s++;}
	}
	static void move(char a,char b) {
		System.out.println("move "+a+" to "+b);
	}
}

结果:

move a to c
move a to b
move c to b
move a to c
move b to a
move b to c
move a to c
7

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 到另一根柱子上,但是规定每次只能移动一个圆盘,并且大圆盘不能放在小圆盘上面。据说完成这个任务需要的步数是2的64次方减1,即18446744073709551615步。这个问题被称为汉诺塔问题,是计算机科学中经典的问题之一,也是递归算法的经典案例。 ### 回答2: 在重摆这些圆盘的过程中,只能用三根柱子,并且每次只能移动一片圆盘,且大圆盘不能放在小圆盘上面。据说完成这个任务需要耗费数百万年时间。 汉诺塔问题被认为是一种重要的数学谜题,它不仅能够培养人们的智力和思维能力,还能够锻炼人们的耐性和毅力。这个问题在数学、计算机科学和物理学等领域具有广泛的应用,被认为是算法和递归的典型例子。 解决汉诺塔问题的方法可以用递归算法来实现。我们先将圆盘分为三个大小不同的部分:最上面的一个圆盘,中间的一组圆盘和最下面的一组圆盘。我们首先将中间的一组圆盘移到第三个柱子上,再将最上面的一个圆盘移到第二个柱子上,最后将第三个柱子上的中间一组圆盘移到第二个柱子上。这样就将圆盘移到了第二个柱子上。然后我们重复这个步骤,将第二个柱子上的圆盘移到第三个柱子上,再将第一组圆盘移到第二个柱子上,最后将第三个柱子上的圆盘移到第一根柱子上。 这个过程可以一直重复,直到所有圆盘都按照大小顺序放在第三个柱子上。虽然这个问题看起来非常简单,但是它的解决过程却十分具有技巧和力量。它激励了人们的想象力和创造力,让我们认识到在解决问题的过程中需要不断地思考和尝试。 ### 回答3: 婆罗门开始动手移动圆盘,但有一个限制条件:每次只能移动一个圆盘,并且不能将大的圆盘放到小的圆盘上面。这个问题在现代数学中被称为“汉诺塔问题”。 为了简化这个问题的描述,我们将三根金刚石柱子分别称为A、B、C。初始情况下,所有圆盘都摆在A柱子上,按照从小到大的顺序从下往上依次为1至64号圆盘,其中1号圆盘最小,64号圆盘最大。目标是将这64个圆盘一个一个地从A柱子移到C柱子上,保证在移动过程中任何一个时刻都满足上面的限制条件,最终让所有圆盘都从小到大按顺序摆在C柱子上。 为了解决这个问题,我们可以首先考虑只有一个圆盘的情况。显然,这种情况下我们只需要将1号圆盘从A移到C即可。 对于两个圆盘的情况,我们可以先将最小的1号圆盘从A移到B,然后将剩下的2号圆盘从A移到C,最后将1号圆盘从B移到C,完成移动。 对于三个及以上数量的圆盘,我们可以将它们分为两部分:最底下的一个圆盘和剩下的圆盘。首先,我们将剩下的圆盘从A移到B,利用C作为缓存。然后,将最底下的圆盘从A移到C,然后将剩下的圆盘从B移到C,最后再将之前移动到C上的最底下圆盘移到C上。 对于n个圆盘的情况,移动的步数可以用公式2^n-1表示。这个公式是这样得来的:对于每个圆盘,我们需要将它移到目标柱子上去,而每次移动时只能移到一个空柱子上,因此需要n-1次空移动。而每次实际移动都需要一步,因此总的移动步数为2^(n-1),减去初始位置到目标位置的一次移动,即为2^n-1。 汉诺塔问题一个经典的递归问题,在计算机科学和数学领域有广泛的应用。它不仅有助于提高我们的递归思维能力,而且还能够促进我们对复杂问题的理解和处理能力,具有很高的教育和启发意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值