问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

“河内塔问题”的解法

发布网友 发布时间:2022-05-01 20:36

我来回答

5个回答

热心网友 时间:2022-06-22 23:18

汉诺塔问题(又称河内塔问题)是根据一个传说形成的一个问题:

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

1. 每次只能移动一个圆盘;
2. 大盘不能叠在小盘上面。

提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。

问:如何移?最少要移动多少次?
一般取N=64。这样,最少需移动264-1次。即如果一秒钟能移动一块圆盘,仍将需5845.54亿年。目前按照宇宙大爆炸理论的推测,宇宙的年龄仅为137亿年。

在真实玩具中,一般N=8;这将需移动255次。如果N=10,需移动1023次。如果N=15,需移动32767次;这就是说,如果一个人从3岁到99岁,每天移动一块圆盘,他仅能移动15块。如果N=20,需移动1048575次,即超过了一百万次。
先看hanoi(1, one, two, three)的情况。这时直接将one柱上的一个盘子搬到three柱上。注意,这里one柱或three柱到底是A、B还是C并不重要,要记住的是函数第二个参数代表的柱上的一个盘被搬到第四个参数代表的柱上。为方便,将这个动作记为:
one =》three

再看hanoi(2, one, two, three)的情况。考虑到hanoi(1)的情况已经分析过了,可知这时实际上将产生三个动作,分别是:
one =》two
one =》three
two =》three
很显然,这实际上相当于将one柱上的两个盘直接搬到three柱上。

再看hanoi(3, one, two, three)的情况。分析
hanoi(2, one , three, two)
one =》three
hanoi(2, two, one, three)
即:先将one柱上的两个盘搬到two柱上,再将one柱上的一个盘搬到three柱上,最后再将two柱上的两个盘搬到three柱上。这不就等于将one柱上的三个盘直接搬到three柱上吗?

运用归纳法可知,对任意n,
hanoi(n-1, one , three, two)
one =》three
hanoi(n-1, two, one, three)
就是先将one柱上的n-1个盘搬到two柱上,再将one柱上的一个盘搬到three柱上,最后再将two柱上的n-1个盘搬到three柱上。这就是我们所需要的结果!
回答者:wuchenghua121 - 经理 四级 12-5 11:51
汉诺塔
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。

后来,这个传说就演变为汉诺塔游戏:

1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上

经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

此外,汉诺塔问题也是程序设计中的经典递归问题。

补充:汉诺塔的算法实现(c++)
#include <fstream>
#include <iostream>
using namespace std;

ofstream fout("out.txt");

void Move(int n,char x,char y)
{
fout<<"把"<<n<<"号从"<<x<<"挪动到"<<y<<endl;
}

void Hannoi(int n,char a,char b,char c)
{
if(n==1)
Move(1,a,c);
else
{
Hannoi(n-1,a,c,b);
Move(n,a,c);
Hannoi(n-1,b,a,c);
}
}

int main()
{
fout<<"以下是7层汉诺塔的解法:"<<endl;
Hannoi(7,'a','b','c');
fout.close();
cout<<"输出完毕!"<<endl;
return 0;
}

C语言精简算法
/* Copyrighter by SS7E */
#include<stdio.h> /* Copyrighter by SS7E */
void hanoi(int n,char A,char B,char C) /* Copyrighter by SS7E */
{
if(n==1)
{
printf("Move disk %d from %c to %c\n",n,A,C);
}
else
{
hanoi(n-1,A,C,B); /* Copyrighter by SS7E */
printf("Move disk %d from %c to %c\n",n,A,C);
hanoi(n-1,B,A,C); /* Copyrighter by SS7E */
}
}
main() /* Copyrighter by SS7E */
{
int n;
printf("请输入数字n以解决n阶汉诺塔问题:\n");
scanf("%d",&n);
hanoi(n,'A','B','C');
}/* Copyrighter by SS7E */
回答者: Vanquisher_ - 举人 五级 12-5 13:57
parcel::::::::::
program hanoi;
functionhanoi(x:integer):longint;
begin
if x=1 then hanoi:=1;
if x=2 then hanoi:=3;
else
begin
hanoi:=2*hanoi(x-1)+1;
end;
end;

begin
read(x){第几个数 }
write(hanoi(x));
end.

思想就是:第N个就等于第n-1个乘以2+1次

热心网友 时间:2022-06-22 23:18

http://bzzj.52samsung.com/yuanxiaoxu/online/%E6%B2%B3%E5%86%85%E5%A1%94.htm
河内塔(又称汉诺塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。

后来,这个传说就演变为汉诺塔游戏:
1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上

问题解决步骤:2的n次方-1,n为河内塔的阶数

热心网友 时间:2022-06-22 23:19

趣味数学——河内塔问题趣味数学——河内塔问题
如在四年级数学上册120页有这样的思考题:
1.有三根杆子1.2.3。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从1杆全部移到3杆上
经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:1→3,1→2,3→2,1→3,2→1,2→3,1→3赞同0|评论

热心网友 时间:2022-06-22 23:19

这是一个最典型的 递归问题

河内塔(汉诺塔)介绍看百度百科
http://ke.baidu.com/view/191666.htm

求 有n层塔时 所需的移动的次数 f(n)

解法思想:
首先要把上面的n-1层塔 移动到 B杆上
所需的次数是f(n-1),
然后把第n层移动到c杆
所需的次数 是 1次
最后再把b杆上的 n-1层 移动到 c杆
所需次数是f(n-1)

所以 f(n)=f(n-1)+1+f(n-1)=2f(n-1)+1

就得到其递归解法
然后 f(1)=1,f(n)=2f(n-1)+1 这俩个条件
学过离散数学的话 就可以推出
f(n)=2^n - 1 具体步骤不累述了。

热心网友 时间:2022-06-22 23:20

番茄战士 的说法是正确的。
但我想说的是一般怎么去解决这个问题才是最快的解决方法。

先从最底座的那个看起,要将它最左移到最右,最快的方法是其它的碟子全在中间的杆子上,这样,只要移一步就可以到位了。

至于倒数第二个碟子,因为倒数第一个要一步移到最右边,所以在这之前,它必须在中间的杆子上,也就是说,要想它总共只移两步,第一步它所停的位置必须是中间的那个杆子。

同理,倒数第三个得先放在最右边那个杆子上,
倒数第四个得先放在中间的那个杆子上,
倒数第五个得先放在最右边的那个杆子上,
..........

如此可知,从最底座的碟子算起,奇数位的碟子得先放在最右边位的杆子上,偶数位的碟子得先放在中间的杆子上。

当然,当最底座的碟子放好之后,其它的同理考虑,
其它的情况当然也是同样的考虑。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
会计中级什么时候拿证 会计中级职称什么时候领取 手机中毒后恢复出厂设置就可以了吗? 手机中病毒后如何清除? 做代购初期怎么找客源,微商代购怎么找精准客 ...代购,都是阿迪耐克正品。怎么才能把微商做好。 做微商和代购,有哪些引流获客的方法? 250㎜的水泥撑棍一捆多少根? 吊顶一平要多少丝杠 ...断开电源,一端接地,这个时候把极板远离,为什么是两极板电压变大而... 高中生晚上做什么运动锻炼好? 河南一高中生跑操猝死,校方拒赔120万,死者家属该如何维权? 关于汉诺塔的问题。 我是一个高中生 正值青春期 很想和人做爱 该怎么办 高中生还要跑操吗 如何对高中生进行性教育 高中生早晨跑操是谁规定的? 高中生能开始性交了吗? win7开机自动启动项怎么设置 win7怎么添加开机启动项 一两龙虾尾大概有多少个 苹果手机花椒怎么充值划算? 刷酸频率多,会对皮肤有什么危害? 满脸长闭合性粉刺什么时候刷酸一次? 刷酸早上刷好还是晚上刷好 初生婴儿肚脐怎么护理 新生儿肚脐结痂掉了后一直不愈合怎么办? 新生儿肚脐血痂是否要帮助处理掉? 求解:主营收入税前利润率和税后利润率、扣除非经常损益后的净利润率、营业比率等公式。 求助我的微信登陆就显示磁盘满了,怎么办,是在我的D盘里吗 第九套广播体操高中生要学吗? 高中生广播体操要跳交谊舞或华尔兹,有这回事吗? 高中生是跑操好还是做广播体操好? 高中生如何进行性教育! 高中生早操重要性? 优雅不易重名的女孩名字。帮女宝宝取名字,姓黄牛尾的? 缴纳住房公积金到底有什么好处 苹果系统正式版,DP版,GM版都什么意思?有什么不同?求神人指点_百度知 ... 女宝宝,姓张,好听不容易重名的名字 苹果手机11安装13.5GM版后再出新版本还能安装吗? 我是iOS12GM版本,我想回到正式版就把描述文件删了,重启之后系统还是有个小红点 为什么我的iPhone X还不提示能更新iOS12 现在用的是iOS12GM版 别人的都能更新了 iOS12GM版以后还能更新到iOS12.1正式版吗 我现在用的是iOS12GM版的 海尔小海贝热水器密封圈垫漏水? 海尔热水器的进水管老崩开是怎么回事? 海尔热水器胆口胶垫坏了漏水还可以继续使用吗? 海尔热水器右侧端头漏水,怎么治?非专业人士 海尔热水器漏油棕色的 家里安装空气源昨天停水水管怎么排空? 海尔热水器加热管固定螺丝塑料垫怎么卸