早教吧作业答案频道 -->其他-->
汉诺塔递归函数问题请各位大侠详细说明一下下面递归函数是如何运作的.intstep=1;voidmove(int,char,char,char);这一句什么意思.为什么可省去变量名.main(){intn;printf("请输入盘数n=");scanf("%d",&n)
题目详情
汉诺塔递归函数问题请各位大侠详细说明一下下面递归函数是如何运作的. intstep=1; voidmove(int,char,char,char);这一句什么意思.为什么可省去变量名. main() {intn; printf("请输入盘数n="); scanf("%d",&n); printf("在3根柱子上移%d只盘的步骤为:\n",n); move(n,'a','b','c');}这一句? voidmove(intm,charp,charq,charr) {if(m==1) {printf("[%d]move1#from%cto%c\n",step,p,r); step=step+1;} else{move(m-1,p,r,q);这一句是如何运行的. printf("[%d]move%d#from%cto%c\n",step,m,p,r); step=step+1; move(m-1,q,p,r);这一句是如何运行的. } getch();}
▼优质解答
答案和解析
递归其实很简单,你只要晓得啥子是嵌套调用就可以了,所谓嵌套调用,就是在一个函数里调用另一个函数,main函数不能被调用的,所以递归就是有限次的嵌套调用本身函数,每次调用,系统都会重新分配内存,返回时就返回上次调用他的那块内存中的调用函数处,这样理解应该很简单了 voidmove(int,char,char,char);/*声明函数,告诉系统我随后要定义一个函数,他不对其中参数进行检查,所以可以省略参数,一般只写类型,表示有多少个什么类型的参数,便于自己理解*/ main() {intn; printf("请输入盘数n="); scanf("%d",&n); printf("在3根柱子上移%d只盘的步骤为:\n",n); move(n,'a','b','c');}/*函数调用,用a,b,c代表3跟柱子,把盘子数,柱子代码传给函数*/ voidmove(intm,charp,charq,charr)//定义函数 {if(m==1) {printf("[%d]move1#from%cto%c\n",step,p,r); step=step+1;} else{move(m-1,p,r,q);//调用本身函数,进行递归A printf("[%d]move%d#from%cto%c\n",step,m,p,r); step=step+1; move(m-1,q,p,r);//再次调用B } getch();} 这里面的递归涉及一个汉诺塔的算法问题,具体讲明白的话有点麻烦,总体思路是假设盘子全在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]move3#fromatoc吗 */ 注意调用传入的顺序是q,p,r,传入的值是c,a,b的顺序,被调函数中是拿p,q,r的顺序在接收,所以被调函数中值的顺序就该是p=c,q=a,r=b,执行if就输出c->b 不要想太复杂了,q,p,r是变量,用来存储值的,而他只是个局部变量,每次调用函数后给q,p,r新分配的内存地址不一样。比如本次函数中q,p,r中放的值分别是q=c,p=a,r=b,当执行调用函数时,给被调函数传入的是变量的值,也就是说实际上传入的是c,a,b 在被调函数中,p,q,r是新的局部变量,他接收来自调用函数中的值,行参接收值的顺序与实参传入值的顺序是相对应的,因为实参传入的顺序是c,a,b,在行参接收值时也以这样的顺序接收,而行参变量的顺序是p,q,r,所以被调函数中p=c,q=a,r=b
看了汉诺塔递归函数问题请各位大侠详...的网友还看了以下:
将文言文阅读中划横线的句子和教材上学过的句子翻译成现代汉语。(6分)①若中道而归,何异断斯织乎?( 2020-04-06 …
质量为1.2kg、体积为2×10的3次立方厘米的木块投入水中完全静止时受到的浮力为多大?木块的重力 2020-05-13 …
“1997香港回归”如何用英语翻译 2020-05-16 …
七十七回关羽被抓住后,孙权非常高兴,说道:“云长世之豪杰,孤深爱之.今欲以礼相待,劝使归降,何如? 2020-06-09 …
往事秋风扫落叶,落叶归家何处寻,寻寻觅觅,落叶归根和枝依. 2020-07-03 …
明朝陶宗仪的诗-----风雨归舟-----全诗是什么意思?山雨溪风晚未休,萧萧落叶满汀洲,渔船罢钓 2020-07-12 …
郑人买履里的归和何是什么意思?郑人有欲买履者,先自度其足,而置之其坐.至之市,而忘操之.已得履,乃 2020-07-16 …
残星散,归人何处,云飘无忌,情在何处?三月桃花,春风爱人心,芳飞尽,独上人生路,一曲醉相思.请问能 2020-07-26 …
翻译下面的古文有失牛者。就宽车认之。宽下驾步归。有顷。失牛者得牛。送还。谢曰。惭负长者。随所刑罪。宽 2020-12-14 …
陶渊明由何处而归?归向何处?为何要归?用《归去来兮辞》原文中的词句作答. 2020-12-15 …