汉诺塔 Hanoi Tower

电影《猩球崛起》刚开始的时候,年轻的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亿年,到时宇宙还在不在......

转载于:https://www.cnblogs.com/WilberZhao/p/4166214.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值