汉诺塔次数

核心提示汉诺塔次数 :261-1步在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔(Towe

汉诺塔次数 :261-1步

在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔(Tower of Hanoi)。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片到另一根针上。法则是一次只移动一片,而且小片必在大片上面。当所有的金片都从梵天穿好的那根针上移到第三根针上时,世界就将在一声霹雳中消灭,梵塔、庙宇和众生都将同归于尽。利用数学方法可以计算得出,若传说属实,僧侣们需要264?1步才能完成这个任务。若他们每秒可完成一次盘子的移动,就需要5849亿年才能完成。整个宇宙现在也不过137亿年。

你好!

汉诺塔流程图:

void?move(int?,?char?,char,char);??

main()?

{int?n;?

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

scanf("%d",&n);?

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

move(n,'a','b','c');}?

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

{if?(m==1)?

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

step=step+1;}?

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

printf("[%d]?move?%d#?from?%c?to?%cn",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变量搞混了?

?

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

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

 
友情链接
鄂ICP备19019357号-22