一.汉诺塔问题
二.代码展示
总结
汉诺塔问题
汉诺塔: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
先来看两个盘子如何移动。我们首先先将较小的放在B柱上(A->B),在将较大的放在C柱上(A->C),最后把B柱上的移动到C柱上(B->C),这里我们是借助B柱将A柱上的盘子移动到C柱。
接下来看三个盘子如何移动
三层看上去会复杂一些,但是我们将画圈的两个看成一个盘子,只需要重复只有“两个盘子”移动的步骤就可以得出这个解;即:A->B A->C B->C
但这是我们假定的.那么是如何将画圈的两个盘子放在B柱上?
如何所示:
分为三步:A ->C A->B C->B 这就把a和b的盘子移动到B柱子上了,这里我们是借助C柱将A柱上的两个盘子移动到B柱。
再次执行A->C,那么这个最大的盘子就到C了
接下来B柱上的两个盘子如何移动到C柱上呢?
我们再来看下面的图:
C柱上已经是最大的盘子了,可以忽略不计,那么就是实现A,B的互换。
也就是B-A,B-C,A-C.
综上,汉诺塔的问题可以分成三步骤:
将n-1个盘子放到B柱上
将剩余的一个盘子(即最大的)放到C柱最底部
再将B柱上的n-1个盘子放在C柱上
此题的递归就在于n-1就需要把n-2个盘子当做一个来弄,n-2就需要把n-3当做一个来看,一直递归直到只有一个的时候A->C
if (paramNumber == 1) {
System.out.println(paramSource + "->" + paraDestination + " ");
return;
}//of if
将n-1个盘子移动到B柱子时,我们需要借助C柱(参考n=3的时候)
然后A柱最大的盘子放到C柱上
最后把B柱子上的n-1个盘子移动到C柱上,需要借助A柱(参考n=3的时候)
代码展示
运行结果
a->c
a->b
c->b
a->c
b->a
b->c
a->c
总结
用三个盘子进行推算,可以大致演算出其中的过程。关于这里我们是借助B柱将A柱上的盘子移动到C柱。和这里我们是借助C柱将A柱上的两个盘子移动到B柱。,总觉得其中的过程很熟悉,但是却说不出口。汉诺塔把一个把一个复杂的问题分解成很多规模较小的子问题,也就是不断的递归。不得不说,递归这玩意属实考验人的脑容量,现在看起来是知道三个盘子如何移动,但是10个,100个,1000个该如何操作?这对于计算机而言是简单的,我们只需要给出递归结束条件和递归公式即可(本题可靠模拟得出)。