本文目录
如何计算汉诺塔移动次数和总次数
1层:1次
2层:3次
3层:7次
4层:15次
5层:31次
6层:63次
7层:127次
8层:255次
9层:511次
计算公式:f(x)=2^x-1
扩展资料
计算公式推导过程如下:
假设有n个圆盘,移动次数为f(n),根据经验,f(1)=1,f(2)=3
以3层为例,进行推导。可把整个过程分成三步,其中三个圆盘分别用A、B、C、代替且A的半径《B的半径《C的半径
1、把A、B移到中间的柱子,需要f(2)步
2、把C移动到第三根柱子,需要1步
3、把A、B再移动到第三根柱子,需要f(2)步
所以f(3)=f(2)+1+f(2)=7
同理,当圆盘数量为4时,三个步骤分别需要f(3)步、1步、f(3)步,即f(4)=f(3)+1+f(3)=15
由此可得递推公式:f(x+1)=2*f(x)+1
进一步可以通项公式:f(x)=2^x-1
参考资料来源:百度百科-汉诺塔
如何推导汉诺塔的公式
汉诺塔通项公式汉诺塔问题家传户晓,其问题背景不做详述,此处重点讲解在有3根柱子的情况下,汉诺塔问题求解的通项公式的推导。问题背景:有A,B和C三根柱子,开始时n个大小互异的圆盘从小到大叠放在A柱上,现要将所有圆盘从A移到C,在移动过程中始终保持小盘在大盘之上。求移动盘子次数的最小值。变量设置:n为圆盘个数,H(k)为n=k时移动盘子次数的最小值。递推公式: H(k)=2H(k-1)+1。通项公式:H(k)=2^k-1。证明:(1)证明递推公式:首先被移动到C盘的必定是最大的盘子,否则必定违反“在移动过程中始终保持小盘在大盘之上”的规定。既然要将最大盘移动到C,此时最大盘之上必定没有任何盘子,亦即它独自在一根柱子上,要做到这点最优做法当然是先把较小的n-1个盘子由A移动到B,剩下最大盘独自在A。将n-1个盘由A移动到B花费的最少次数为H(n-1)。此时再将最大盘由A移动到C,此时移动总次数为H(n-1)+1。接着把剩下的n-1个盘由B移动到C,花费的最少次数当然也是H(n-1)。于是得到总移动次数2H(n-1)+1.证得H(k)=2H(k-1)+1。(2)推导通项公式。由H(k)=2H(k-1)+1得H(k)+1=2(H(k-1)+1),于是{H(k)+1}是首项为H(1)=1,公比为2的等比数列,求得H(k)+1 = 2^k,所以H(k) = 2^k-1
汉诺塔的规律是什么
汉诺塔规律总结口诀是单左双右,先小后大,一步两步,循环往复。
设3个柱子分别是甲,乙,丙,把3根柱子看成一个循环,也就是说,甲的右边是乙,乙的右边是丙,而丙的右边则回到甲,同理,甲的左边就是丙。简单点,记住丙的右边是甲,和甲的左边是丙就行了。盘子分别是盘1,盘2,盘3,盘4……盘1最小。按照“单左双右”的规律,先移动小的,也就是先移动盘1,再移动盘2,盘3,按顺序,把能移动的都移动一次,每次移动一步,如果不符合游戏规则,就移动两步,还是不符合的话,就找到盘1,重新按照“单左双右”的规则走,直到完成游戏。
汉诺塔公式:
现在有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动?
设移动次数为H(n)。首先我们肯定是把上面n-1个盘子移动到柱子C上,然后把最大的一块放在B上,最后把C上的所有盘子移动到B上,由此我们得出表达式:
H⑴=1。
H(n) = 2*H(n-1)+1 (n》1)。
那么我们很快就能得到H(n)的一般式:
H(n) = 2^n - 1 (n》0)。
汉诺塔通关公式是什么
汉诺塔是一个迭代问题,我们先假设x层汉诺塔从第一根柱子移动到最后一根柱子(目标柱子)的最快次数是f(x)次显然f(1)=1f(2)=3然后看3层的,我们可以把整个过程分解为三个部分一,把第一第二层移动到中间的柱子(过渡柱子),最快f(2)步二,把第三层移动到最后一根柱子(目标柱子),最快1步三,把刚才移动到中间柱子的第一第二层移动到最后一根柱子,最快f(2)步所以f(3)=f(2)+1+f(2)=7然后以此类推f(4)=f(3)+1+f(3)=15f(5)=f(4)+1+f(4)=31f(6)=f(5)+1+f(5)=63f(7)=f(6)+1+f(6)=127f(8)=f(7)+1+f(7)=255f(9)=f(8)+1+f(8)=511PS.如果学习过数列的话,这个其实可以得到更为一般的递推公式f(x+1)=2*f(x)+1再进一步,可以得到通项公式为f(x)=2^x-1
汉诺塔问题公式是什么
汉诺塔问题(又称河内塔问题)是根据一个传说形成的一个问题:有三根杆子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 =》twoone =》threetwo =》three很显然,这实际上相当于将one柱上的两个盘直接搬到three柱上。再看hanoi(3, one, two, three)的情况。分析hanoi(2, one , three, two)one =》threehanoi(2, two, one, three)即:先将one柱上的两个盘搬到two柱上,再将one柱上的一个盘搬到three柱上,最后再将two柱上的两个盘搬到three柱上。这不就等于将one柱上的三个盘直接搬到three柱上吗?运用归纳法可知,对任意n,hanoi(n-1, one , three, two)one =》threehanoi(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:57parcel::::::::::program hanoi;functionhanoi(x:integer):longint;beginif x=1 then hanoi:=1;if x=2 then hanoi:=3;elsebeginhanoi:=2*hanoi(x-1)+1;end;end;beginread(x){第几个数 }write(hanoi(x));end.思想就是:第N个就等于第n-1个乘以2+1次
汉诺塔八层九层公式
计算公式:f(x)=2^x-1,8层:255次,9层:511次。计算公式推导过程如下:假设有n个圆盘,移动次数为f(n),根据经验,f(1)=1,f(2)=3。以3层为例,进行推导。可把整个过程分成三步由此可得递推公式:f(x+1)=2*f(x)+1。进一步可以通项公式:f(x)=2^x-1
关于河内塔问题的公式
汉诺塔问题(又称河内塔问题)是根据一个传说形成的一个问题:有三根杆子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次,即超过了一百万次。
汉诺塔问题通项公式
通项公式:H(k)=2^k-1。
汉诺塔游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,可以做以下三步:
(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;
(2)将A杆中剩下的第n号盘移至C杆;
(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。
事实上,上述方法设盘子数为n, n可为任意数,该法同样适用于移动n-1个盘。因此,依据上法,可解决n -1个盘子从A杆移到B杆(第一步)或从B杆移到C杆(第三步)问题。现在,问题由移动n个盘子的操作转化为移动n-2个盘子的操作。
依据该原理,层层递推,即可将原问题转化为解决移动n -2、n -3… … 3、2,直到移动1个盘的操作,而移动一个盘的操作是可以直接完成的。
扩展资料:
目前关于汉诺塔问题解决的一个最主要的观点认为,完成汉诺塔任务时要对圆盘的移动顺序进行预先计划和回顾性计划活动。
当问题呈现后,在开始第一步的移动之前,大多数被试都会根据设定好的目标状态,对圆盘的移动顺序进行预先计划。以决定圆盘的移动顺序,但是这种计划能力的作用可能会受到问题难度的影响。
也有研究者认为,不是计划能力而是抑制能力参与汉诺塔问题的解决过程。为了把更大的圆盘先放置于指定位置,必须让较小的圆盘暂时偏离其最终应该放置的位置,但被试的自然反应总是“尽快”将圆盘移动到最终的目的地,如此反而导致错误,使移动步数更多,完成时间更长。
汉诺塔该怎么玩,方法
汉诺塔算法介绍:
一位美国学者发现的特别简单的方法:只要轮流用两次如下方法就可以了。
把三根柱子按顺序排成“品”字型,把所有圆盘按从大到小的顺序放于柱子A上,根据圆盘数量来确定柱子排放的顺序:
n若为偶数的话,顺时针方向依次摆放为:ABC;而n若为奇数的话,就按顺时针方向依次摆放为:ACB。这样经过反复多次的测试,最后就可以按照规定完成汉诺塔的移动。
因此很简单的,结果就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C。
扩展资料:
汉诺塔经典题目:
三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,且每次移动同一根柱子上都不可以出现大盘子在小盘子上方的情况。
至少需要几次移动的问题,我们设移动次数为H(n)。
把上面n-1个盘子移动到柱子C上,把最大的一块放在B上,把C上的所有盘子移动到B上,由此我们得出表达式:
H⑴ = 1
H(n) = 2*H(n-1)+1 (n》1)
很快我们就可以得到H(n)的一般式为:
H(n) = 2^n - 1 (n》0)
且这种方法的确是最少次数的,证明非常简单,可以尝试从2个盘子的移动开始证,可以试试。
进一步加深问题:
假如现在每种大小的盘子都有两个,并且是相邻的,设盘子个数为2n,问:⑴假如不考虑相同大小盘子的上下要几次移动,设移动次数为J(n);⑵只要保证到最后B上的相同大小盘子顺序与A上时相同,需要几次移动,设移动次数为K(n)。
⑴中的移动相当于是把前一个问题中的每个盘子多移动一次,也就是:
J(n) = 2*H(n) = 2*(2^n - 1) = 2^(n+1)-2
在分析⑵之前,我们来说明一个现象,假如A柱子上有两个大小相同的盘子,上面一个是黑色的,下面一个是白色的,我们把两个盘子移动到B上,需要两次。
盘子顺序将变成黑的在下,白的在上,然后再把B上的盘子移动到C上,需要两次,盘子顺序将与A上时相同,由此我们归纳出当相邻两个盘子都移动偶数次时,盘子顺序将不变,否则上下颠倒。
回到最开始的问题,n个盘子移动,上方的n-1个盘子总移动次数为2*H(n-1),所以上方n-1个盘子的移动次数必定为偶数次,最后一个盘子移动次数为1次。
讨论问题⑵:
综上可以得出,要把A上2n个盘子移动到B上,可以得出上方的2n-2个盘子必定移动偶数次,所以顺序不变,移动次数为:
J(n-1) = 2^n-2
然后再移动倒数第二个盘子,移动次数为2*J(n-1)+1 = 2^(n+1)-3,
最后移动最底下一个盘子,所以总的移动次数为:
K(n) = 2*(2*J(n-1)+1)+1 = 2*(2^(n+1)-3)+1 = 2^(n+2)-5
参考资料:
汉诺塔(益智玩具)-百度百科