汉诺塔5层游戏31步图解,汉诺塔5层攻略规律口诀

【汉诺塔流程图】

你好!

汉诺塔流程图:

void move(int , char ,char,char); /*声明函数,告诉系统我随后要定义一个函数,他不对其中参数进行检查,所以可以省略参数,一般只写类型,表示有多少个什么类型的参数,便于自己理解 */

main()

{int n;

printf("请输入盘数n=" );

scanf("%d",&n);

printf("在3根柱子上移%d只盘的步骤为:\n",n);

move(n,'a','b','c');}/*函数调用,用a,b,c代表3跟柱子,把盘子数,柱子代码传给函数*/

void move(int m, char p, char q, char r) //定义函数

{if (m==1)

{printf("[%d] move 1# from %c to %c\n", step, p,r);

step=step+1;}

else{move(m-1,p,r,q); //调用本身函数,进行递归 A

printf("[%d] move %d# from %c to %c\n",step, m,p,r);

step=step+1;

move(m-1,q,p,r); //再次调用 B

}

getch();}

递归其实是嵌套调用,

所谓嵌套调用,就是在一个函数里调用另一个函数,

main函数不能被调用的,

所以递归就是有限次的嵌套调用本身函数

每次调用,系统都会重新分配内存,

返回时就返回上次调用他的那块内存中的调用函数处,

这样理解应该很简单了

汉诺塔流程图解析:

这里面的递归涉及一个汉诺塔的算法问题,具体讲明白的话有点麻烦,总体思路是假设盘子全在a柱上,想放到c上

第N个人就想要是有人搬动其他N-1个盘子到b,那他只要搬一次从a到c就可以,在让那个人把N-1个盘子放到c上

第N-1那个人就想要是有人搬动其他N-2个盘子到c,他只要搬动一次从a到b就可以,在让那个人把N-2个盘子放到b上

....

第1个人就直接把盘子从a到c

这样形成递归

我在俩处调用标记了A,B,我写出步踌,你看看.

假设3个盘子

A函数相当于双重循环中的外层循环

B函数相当于双重循环中的内层循环

1,主函数调用,p=a,q=b,r=c,m=3,运行A,调用本身(A第一次调用)传入p,r,q(a,c,b) 注意调用函数中p,r,q排列

2,被调函数是用p,q,r的顺序接收传入的p,r,q.p=a,q=c,r=b,m=2,执行A,调用本身(A第二次调用) 调用传入p,r,q(a,b,c)

3,p=a,q=b,r=c,m=1,执行if,输出a->c,返回A第二次调用

4,本次函数中p=a,q=c,r=b,m=2,向下执行,输出a->b,执行B,调用本身(B第一次调用),传入q,p,r(c,a,b),m=1

5,p=c,q=a,r=b,m=1,执行if,输出c->b,返回B第一次调用

6,向下执行,执行完毕,返回A第一次调用

7,本次函数中p=a,q=b,r=c,m=3,向下执行,输出a->c,执行B,调用本身(B第一次调用),传入q,p,r(b,a,c),m=2

8,p=b,q=a,r=c,m=2,执行A,调用本身(A'第一次调用,注意是B函数调用中再次调用A) 传入p,r,q(b,c,a)

9,p=b,q=c,r=a,m=1,执行if,输出b->a,返回A'第一次调用

10,本次函数中p=b,q=a,r=c,m=2向下执行,输出b->c,执行B,调用本身(B'的第一次调用,注意是B函数中再次调用B) 传入q,p,r(a,b,c),m=1

11,p=a,q=b,r=c,m=1,执行if,输出a->c返回B'第一次调用

12,向下执行,执行完毕,返回B第一次调用

13,向下执行,执行完毕,返回主函数

仔细分析每次调用时当前变量p,q,r中所代表的a,b,c,每次调用时,p,q,r都是新的变量

我看了你的问题,估计你把调用函数中的p,q,r变量与被调函数中p,q,r变量搞混了

/*

4,向下执行,执行B,调用本身(B第一次调用),由于本次函数中p=a,q=c,r=b,m=2,先输出a->b,再传入q=c,p=a,r=b,m=1

这里不是[4] move 3# from a to c吗

*/

注意调用传入的顺序是q,p,r,传入的值是c,a,b的顺序,被调函数中是拿p,q,r的顺序在接收,所以被调函数中值的顺序就该是p=c,q=a,r=b,执行if就输出c->b

补充:流程图步骤画了好久额,有什么疑问发我邮箱315946173@qq.com

【汉诺塔移动五层最快的多少秒】

汉诺塔移动时,三个盘子要移动7步,这是固定的。当四个盘子时,它先要把最上面的三个盘子移动到另外一根针上(这时移动了7步),然后把第四个盘子移动到另一根针上(这时共移动了8步,三个盘子的7步加上第四个盘子的1步),最后再把那三个盘子移动到第四个盘子上面(又是7步),所以,四个盘子要移动15步。五个盘子也是同样,我们知道了四个盘子的移动步数是15步,那么5个盘子就是15+1+15等于31步。由此得出结论:每增加一个盘子,它的移动步数就增加原来步数的一倍加1。我们已经知道5个盘子移动31步,那么,6盘子就是31*2+1=63步。7盘子就是63*2+1=127步

【史上最难智力游戏第五关汉诺塔怎么过】

1
先判断塔的个数为奇数或者偶数。
2
记住口诀,奇数向左,偶数向右。
3
眼睛盯住最上面的那个小塔,第一步操作根据上面的奇左偶右原则,将它向左或者向右移动。
4
移动完毕后,下一步不可再操作这个小塔,而是走其它任意一步(实际上有且只有一步操作合法)。
5
眼睛继续盯住小塔,按原来的奇左偶右原则,同样的方式移动(即原来是向左或者向右移动,这次仍然是向左或者向右移动)。
6
同第4步,不可操作该小塔,走其它任意一步(实际上有且只有一步操作合法)。
7
循环操作,最终会达到将整个塔整体移动到最右边。

【汉诺塔怎么玩】

A------->B
A------->C
B------->C
A------->B
C------->A
C------->B
A------->B
A------->C
B------->C
B------->A
C------->A
B------->C
A------->B
A------->C
B------->C
A------->B
C------->A
C------->B
A------->B
C------->A
B------->C
B------->A
C------->A
C------->B
A------->B
A------->C
B------->C
A------->B
C------->A
C------->B
A------->B
A------->C
B------->C
B------->A
C------->A
B------->C
A------->B
A------->C
B------->C
B------->A
C------->A
C------->B
A------->B
C------->A
B------->C
B------->A
C------->A
B------->C
A------->B
A------->C
B------->C
A------->B
C------->A
C------->B
A------->B
A------->C
B------->C
B------->A
C------->A
B------->C
A------->B
A------->C
B------->C

【汉诺塔该怎么玩,方法】

汉诺塔玩法如下:

有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方

拓展内容:

汉诺塔

一、简介

汉诺塔是由三根杆子A,B,C组成的。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。问:如何移?最少要移动多少次?汉诺塔是根据一个传说形成的一个问题:

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

每次只能移动一个圆盘;

大盘不能叠在小盘上面。

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

问:如何移?最少要移动多少次?

二、公式

现在有三根相邻的柱子,标号为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
A------->C
B------->C
A------->B
C------->A
C------->B
A------->B
A------->C
B------->C
B------->A
C------->A
B------->C
A------->B
A------->C
B------->C
A------->B
C------->A
C------->B
A------->B
C------->A
B------->C
B------->A
C------->A
C------->B
A------->B
A------->C
B------->C
A------->B
C------->A
C------->B
A------->B
A------->C
B------->C
B------->A
C------->A
B------->C
A------->B
A------->C
B------->C
B------->A
C------->A
C------->B
A------->B
C------->A
B------->C
B------->A
C------->A
B------->C
A------->B
A------->C
B------->C
A------->B
C------->A
C------->B
A------->B
A------->C
B------->C
B------->A
C------->A
B------->C
A------->B
A------->C
B------->C

标签: 汉诺塔5层游戏31步图解 汉诺塔怎么玩汉诺塔5层攻略规律口诀