电影《猩球崛起》刚开始的时候,年轻的Caesar在玩一种很有意思的游戏,就是汉诺塔......
汉诺塔源自一个古老的印度传说:在世界的中心贝拿勒斯的圣庙里,一块黄铜板上插着三支宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上穿好了由大到小的64片金片,这就是所谓的汉诺塔(Hanoi Tower)。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。
僧侣们预言,当所有的金片从梵天穿好的金片上移到另一根针上时,世界末日就会来临,而梵塔、寺庙和众生也会随之灭亡......
故事不多说了,汉诺塔是递归思想的典型应用,上代码:
1 #include <stdio.h> 2 3 // 将n个金片,借助y,从x移动到z 4 void move(int n, char x, char y, char z) 5 { 6 if ( 1 == n) 7 printf("%c -> %c\n",x,z); 8 else 9 { 10 move(n-1, x, z, y); //将 n-1 个金片从x,借助z,移动到y 11 printf("%c -> %c\n",x,z); //将第 n 个金片从 x 移动到 z 12 move(n-1, y, x, z); //将 n-1 个金片从y,借助x,移动到z 13 } 14 } 15 16 int main() 17 { 18 int n; 19 printf("请输入汉诺塔的层数:"); 20 scanf("%d",&n); 21 move(n,'X','Y','Z'); 22 23 return 0; 24 }
最后,考虑金片移动的步数和金片数的关系:
每增加一个金片,它的移动的步数就等于原来步数的两倍加1。递推公式为:f(n+1) = 2*f(n) + 1,不难得到f(n) = 2^n - 1。
例如3个金片步数为7,那么4个金片步数为2*7+1=15步,5个金片步数为2*15+1=31步。
至此,可以推算金片数为64时,移动的步数为:18446744073709551615步。假设1秒钟移动一次,所需时间为:18446744073709551615秒,大约5845亿年,到时宇宙还在不在......