【Java】——经典例题之汉诺塔(递归实现)

废话不多说,先上代码,请各位看官慢慢享用

public void hanoi(char A,char B,char C,int n){
	if(n == 1){
		System.out.println(A + " --> " + C);
	}else{
		hanoi(A, C, B,n - 1);
		System.out.println(A + " --> " + C);
		hanoi(B, A, C, n - 1);
	}
}

然后我们来慢慢回味汉诺塔的美妙之处(关于汉诺塔的介绍请点击汉诺塔_百度百科,这里不一一概述):

假如看官们没有去百度看过简介,那么我就先来简单介绍一下我们需要用到的道具:
黄铜板:插着三根宝石针。
宝石针:可以串金片,我们可以为此编号A,B,C。
金片:金片……就是金片,无论怎么说,很值钱就对了。
黄铜、宝石针、金片,看起来古时候印度应该是很有钱,要是我生于那个时代就好了,至少吃喝不愁。
哈哈,玩笑归玩笑,我们还是赶紧进入主题吧。
首先我们先来看看思路(先别看代码):
1、假如A上的金片个数是1:
    这个时候直接从A移动到C;
    得到的步骤是:A->C
2、假如A上的金片个数是2:
    首先将A最上面的1个金片移动到B上,再将A上的最后1个移动到C上,最后将B上的金片移动到C上。
    得到的步骤是:A->B,A->C,B->C
3、假如A上的金片个数是3:
    先将A上最上面的2个移动到B上,再将最后1个移动到C上;
    再将B上的最上面的1个移动到A柱子上,再将最后一个移动到C上;
    最后将A上的最后1个移动到C上。
    得到的步骤是:A->C,A->B,C->B,A->C,B->A,B->C,A->C;
4、假如A上的金片个数是4:
    先将前3个移到B柱子上,将最后1个移到C柱子上;
    再将B柱子上的3个中的前2个移到A柱子上,将最后1个移到C柱子上;
    再将A柱子上的2个中的前1个移到B柱子上,将最后一个移到C柱子上;
    最后将B柱子上的金片移到C柱子上。
    得到的步骤是:A->B,A->C,B->C,A->B,C->A,C->B,A->B,A->C,B->C,B->A,C->A,B->C,A->B,A->C,B->C
……
后面的可以类推:
    就是说A上如果有n个,那么将n-1个先移动到B上去,再将最后一个移动到C。
    然后将B上的n-1个中的n-2个移动到A上,将最后1个移动到C上;
    然后再将A上的n-2个中的n-3个移动到B上,将最后一个移动到C上;
    ……
    啊,不行了,这样下去,64个金片的步骤写完,我早已吐血而亡,况且,我也写不完啊,劳烦各位看官各自细细思考了。
首先我们来看这个函数传入的数据是固定的'A'、'B'、'C'以及动态数据n,n代表A上初始的时候有几个金片:
通过上面的思路可以看出:
    n=1时,总共需要移动2^1-1=1次;
    n=2时,总共需要移动2^2-1=3次;
    n=3时,总共需要移动2^3-1=7次;
结论,当A上最初由n个金片时,总共需要移动2^n-1次。
然后我们在去看看我们的思路。
再回去看看代码是不是正如上面所说的那样做的呢(代码跟踪):
1、n = 2:
    hanoi('A','C','B',1),syso:A->B  
    syso:A->C 
    hanoi('B','A','C',1), syso: B->C
    得到的结果为:A->B,A->C,B->C;
2、n = 3:
    hanoi('A','C','B',2)
          hanoi('A','B','C',1) syso:A->C
          syso: A->B
          hanoi('C','A','B',1) syso: C->B
    syso: A->C
    hanoi('B','A','C',2)
          hanoi('B','C','A',1) syso: B->A
          syso: B->C
          hanoi('A','B','C',1) syso: A->C
    得到的结果为A->C,A->B,C->B,A->C,B->A,B->C,A->C;
……
与我们上面思路中写到的步骤一致,各位看官不妨试试,慢慢研究。
多谢品读。



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故渊at

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值