- 三个圆盘子:我们给圆盘子依次编号为1、2、3。从规则判断,首先,我们需要将3移动到C柱子的最底部,所以,我们需要将2和1移动到B柱子上。根据前面讲过,我们需要3步就可以了,然后移动3到C。最后重复之前的步骤,将2和1移动到C上。完整的步骤就是1—C,2—B,1—B,3—C,1—A2—C,1—C,总共需要7步完成。
通过1、2、3阶汉诺塔移动步骤,我们可以推倒出一个公式:
完成步骤=2^n-1,n代表盘子的个数
通过公式我们可以推倒出,四阶汉诺塔需要15步骤,五阶汉诺塔需要31步骤,而64阶汉诺塔需要多少步骤呢?2的64次方减1(18446744073709500000),需要这么多步骤。假设一个步骤需要1秒,我们将结果换算成年的单位:
2^64-1=18446744073709500000 1年=360*24*3600=31104000秒
大概需要5800亿年。宇宙大爆炸至今才45亿年。假设从那时候开始玩,离完成还需要很多很多年,估计玩到人类灭绝还玩不完。
每一个游戏背后都有一个逻辑算法在里面。通过汉诺塔我们已经分析出它的算法,现在我们用Java语言实现它的算法。
我们通过运行方法可以得到1-5阶汉诺塔步骤:
- 一阶:路线:A--->C
- 二阶:路线:A--->B A--->C B--->C
- 三阶:路线:A--->C A--->B C--->B A--->C B--->A B--->C A--->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--->C A--->B C--->B A--->C B--->A B--->C A--->C A--->B C--->B C--->A B--->A C--->B A--->C A--->B C--->B A--->C B--->A B--->C A--->C B--->A C--->B C--->A B--->A B--->C A--->C A--->B C--->B A--->C B--->A B--->C A--->C
- ...
通过代码我们可以算出任意阶的汉诺塔步骤。64阶的汉诺塔步骤电脑也可以算出来,但是电脑需要跑很长时间,即使算出来,也没有条件存储步骤的数据。
附上一段64阶汉诺塔程序运行的视频
算法的逻辑其实很简单:当level(代表几阶汉诺塔)=1的时候,从第一个塔移动到第三个塔,这是一种特殊情况。当level>1时候,递归移动level-1层汉诺塔,直到leve=1停止递归。
这就是汉诺塔的递归算法,古人的智慧真的是很强大。