关于汉诺塔的讨论-vs2017

某印度主神定了一个规矩,把64个由上往下从小到大的金片从一根柱子上通过第二根柱子的帮助移动到第三根柱子上,而且最后必须是由上往下从小到大,一次只能移动一个金片,那么直到完成后,世界就会在一声轰隆中消失。
事实上这不可能做到。因为时间太长了......
一下是C++的编程文件

#include "stdafx.h"

#include<iostream>

using namespace std;

extern int N = 0;


void Move(int n, char a, char b, char c)

{

N++;

if (n == 1)

cout << a << "-->" << c << endl; 

else {

Move(n - 1, a,c, b);

cout<<a<<"-->" << c << endl;

Move(n - 1, b, a, c);

}

}


int main()

{

int m;

cout << "Input the number of disks:" << endl;

cin >> m;

Move(m, 'A', 'B', 'C');

cout << "times=" <<::N << '\n';


system("pause");

return 0;

}

宇宙寿命

如果移动一个圆盘需要1秒钟的话,等到64个圆盘全部重新落在一起,宇宙被毁灭是什么时候呢?

让我们来考虑一下64个圆盘重新摞好需要移动多少次吧。1个的时候当然是1次,2个的时候是3次,3个的时候就用了7次......这实在是太累了

因此让我们逻辑性的思考一下吧。

3个的时候能够移动最大的3盘时如图所示。

到此为止用了7次。

接下来如右图,在上面再放上3个圆盘时还要用7次(把3个圆盘重新放在一起需要的次数)。[4] 

因此,4个的时候是

“3个圆盘重新摞在一起的次数”+1次+“3个圆盘重新摞在一起需要的次数”

=2x“3个圆盘重新摞在一起的次数”+1次

=15次。

那么,n个的时候是

2x“(n-1)个圆盘重新摞在一起的次数”+1次。

由于1 个的时候是1次,结果n个的时候为(2的n次方减1)次。

1个圆盘的时候 2的1次方减1

2个圆盘的时候 2的2次方减1

3个圆盘的时候 2的3次方减1

4个圆盘的时候 2的4次方减1

5个圆盘的时候 2的5次方减1

........

n个圆盘的时候 2的n次方减1

也就是说,n=64的时候是(2的64次方减1)次。

因此,如果移动一个圆盘需要1秒的话,

宇宙的寿命=2的64次方减1(秒)

2的64次方减1到底有多大呢?动动计算器,答案是一个二十位的数字约是

1.84467440*10^19

用一年=60秒x60分x24小时x365天来算的话,大约有5800亿年吧。

太阳及其行星形成于50亿年前,其寿命约为100亿年。

汉诺塔问题在数学界有很高的研究价值,而且至今还在被一些数学家们所研究。

也是我们所喜欢玩的一种益智游戏,它可以帮助开发智力,激发我们的思维。 
n=11时,

图片

假设柱子为A,B,C。关于其递推演算,先设想第n块的移动,它只动一次,它只从A-->C;(1)
那么第n-1块势必从A-->B后再从B-->A,两次;(1X2)
那第n-2块先A-->C,再C-->B,此时它已经跟着前面的走了3次了,再加1从B-->C;(4)
..........n-3(8),n-4(16)....1(pow(2,n-1)).
由等比数列求和公式,N=(1(1-pow(2,n))/(1-2)=pow(2,n)-1.
汉诺塔为64个片,故结果为pow(2,64)-1,这个数据太庞大了,所以或者不到世界灭亡,人类已经灭亡了......

posted @   狂小虎  阅读(19)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示