汉诺塔源于印度一个古老传说的益智玩具。
相传大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
现在暂以3个圆盘为例,代码如下:
package com.itszt.test8; /** * 汉诺塔 * @author 李章勇 */ public class Test2 { static long a=0;//移动的步骤数 //移动函数,n个圆盘,向左或向右移动 static void move(int n,boolean left){ if(n==0){//如果n==0,说明移动结束 return; } //拟订共计n个圆盘,要将第n个圆盘置于左侧的柱子上, //就要先将前n-1个圆盘移到右侧柱子上 move(n-1,!left); if(left){//如果是移动到左侧柱子上 System.out.println("step"+(++a)+"--> "+n+"-->left"); }else{ System.out.println("step"+(++a)+"--> "+n+"-->right"); } //第n个圆盘移到目标柱子上时,剩下的n-1个圆盘必然在另一根柱子上需要递归移动 move(n-1,!left); } public static void main(String[] args) { //模拟移动3个圆盘 move(3,true); } }
上述代码运行结果如下:
step1--> 1-->left step2--> 2-->right step3--> 1-->left step4--> 3-->left step5--> 1-->left step6--> 2-->right step7--> 1-->left
也就是说,3个圆盘的话,累计需移动7次,即(2³-1=7),如果是64个圆盘,则需要移动((2^64)-1)次,如果按照每秒移动一次,约需5800亿年才能移动完毕。