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

C语言函数递归调用问题

发布网友 发布时间:2022-05-31 13:49

我来回答

4个回答

热心网友 时间:2023-10-16 10:17

它主要有两个函数HANOI和MOVE,HANOI表示的是移动前N-1个盘子,MOVE表示移动第N个盘子,参数'A','B','C'表示的是柱子的名称,在程序中ONE,TWO,THREE这三个参数让人看了一头雾水,如果把变量名称改为SOURCE,TEMP,DESTINATION我想更好理解,这三个变量表示的是起始的柱子,过渡的柱子,和目标柱子,可能会问已经把三个柱子命名为A,B,C,为什么还要引入三个变量即:ONE,TWO,THREE(SOURCE,TEMP,DESTINATION).以移动3个盘子为例说明一下这个程序的思路:第一步把前两个从 ONE(SOURCE)借助TWO(TEMP)移动到THREE(DESTINATION)用HANOI函数中的第一个HANOI函数实现,第二步把 ONE余下的最大的盘子移动到THREE,用MOVE函数实现,第三步把TWO柱上的两个盘子借助THREE移回到ONE,用HANOI函数中的第二个 HANOI函数实现,(因为THREE柱上的盘子已经是最大的了,任何盘子都可以放到它的上面,所以可以想象为它不存在)可以想象第三步的时候TWO变成了起始柱,而ONE变成了目标柱,而THREE变成过度柱了,HANOI函数参数的变化正体现了这一点.当运行到这里时,第3个盘子已经从ONE移动到了 THREE(这只是分析,真实情况是只有当递归完成时才做到这一步).这个时候原先移动3个盘子的问题变成移动两个盘子的问题,所以再调用HANOI时盘子的数量为N-1.直到N==1时,调用结束.

递归还是不用好

热心网友 时间:2023-10-16 10:18

要理解递归吗,最好是化多为少
递归的本质是知道(1)a0,(2)递推关系an=f(an-1),那么要求任意an都是可能的
因此汉诺塔可以分解为只有二个盘子,把前(n-1)看作1个
那么n个盘子的问题变成2个盘子的问题

即有二块盘子在x上,现要通过y移到z上
(看下面的之前先自己想一下怎么移二块)

第一步:把上面那一块盘子从x通过z移到y上(为什么不直接移,因为不一定是一块)
第二步:把下面那块直接移到y上(为什么直接移,因为确切只有一块)
第三步:把y上那块盘子通过x移到z上,任务完成(为什么不直接移,因为不一定只有一块)

接下来就是具体实现了,递归一定要有初始条件
即只有一块的时候,只接移,移好就结束
if(m==1)
printf("%c----->%c\n",x,z);
否则就按二块移
else
{
move(m-1,x,z,y); 第一步
printf("%c----->%c\n",x,z,y); 第二步
move(m-1,y,x,z); 第三步
}

热心网友 时间:2023-10-16 10:18

算法思路,比如说10个圆盘,需要从a处移到c处,就是先把上面的9个盘移到b处,(怎么移呢,再调用函数move)再把第十个盘移到c处,再把b里面的9个移到c处,(怎么移呢,再调用函数move)。

经典的函数递归调用案例。
程序解释:函数move(h,'a','b','c');
if(m==1)
printf("%c----->%c\n",x,z); 如果只有一个盘子,那么从x处移到z处。
否则,move(m-1,x,z,y); 先把最上面的m-1个盘子移到y处。
printf("%c----->%c\n",x,z,y); 再把剩下的一个移到从x处移到z处。
move(m-1,y,x,z);再把y处的m-1的盘子移到z处。

关键要理解算法,以及函数中的
move(int m,int x,int y,int z)代表把m个盘子从x移到z处,
move(m-1,x,z,y); 代表把m-1个盘子移到y处,

热心网友 时间:2023-10-16 10:19

递归分为:递推和回推
例:有3个人 不知道其年龄 只找到地给个比第二个大2 第二个比第三个大2 第三个10 ;因此:
递推:第一个——》第二个——》第三个(10)
回推:第三个(10)---》第二个(12)--》第一个(14)

此题一样,是汉诺塔的递归问题。
想要移动盘子,只让最上面的盘子移动,。。。。类推
有三个盘子x, y,z。利用递归算法 将x上的盘子移动到z上 (大的在下,小的在上)

#include <stdio.h>
#include <stdlib.h>
int move(int m,int x,int y,int z)
{
if(m==1) //递归结束条件
printf("%c------>%c\n",x,z);
else
{
move(m-1,x,y,z); //借助y将x上得m-1个盘移动到z上
printf("%c------>%c\n",x,z);
move(m-1,y,x,z); // 借助x盘将y上得m-1个盘移动到z上
}
return m;
}
int main(void)
{
int h;
printf("\nPlease input number:\n");
scanf("%d",&h); //输入盘子的个数
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c'); //调用递归函数
system("pause");
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
上海什么酒店最高大上 业精于勤荒于嬉。行成于思毁于随 ""业精于勤,荒于嬉,行成于思,毁于随"是什么意思?解释的好点 文才神摆在阳台东南面朝窗户好吗 高锰酸钾鱼缸要泡多久合适 高锰酸钾泡鱼缸的时间介绍 高锰酸钾浸盆要多久 高锰酸钾浸泡需要的时间是多久? 高锰酸钾要泡多久合适 高锰酸钾要泡多长时间合适 天气炎热,长途车下面放行李的地方放活的黄鳝会死吗 15款明锐1.4 t烧机油吗 ...年斯柯达明锐换了四个点火线圈四个火花塞油耗增大两升左右为什么... 递归为什么这么难理解 ma2怎么能从u盘上倒 grandma2怎么连接外接显示器 PCB板上的MA2是什么意思 卡西欧6000摇晃机芯里有声音吗 刚相亲的女孩,给他发红包她不要,买礼物也不收,但是俩人聊天还很好,这个要不要坚持下去呀, 我跟她相亲认识的,第一次玩约会时我亲了她,第二天早上我发红包给她,她为什么不收 给相亲的女孩发红包,女孩没领是为什么啊。认识时间不长 我们相亲认识的,我发红包给她她不收,她说的话是什么意思?我们还有戏吗? 昆明到安宁金方温泉要怎么坐车?自助游 从昆明去安宁泡温泉,要怎么去,温泉哪里比较,都有些什么价位的啊?还有住宿难不难找啊?两个人 乌兹别克斯坦自驾游需要什么手续 中国的驾照怎么样可以换取国际驾照 腾讯王卡开通激活后为什么显示中国联通但是没信号 腾讯大王卡突然没有4g信号怎么办? “腾讯大王卡”没有信号怎么办? 大王卡没信号 腾讯大王卡没信号怎么办? 联通腾讯王卡插到手机没信号? 腾讯大王卡为什么没有信号 百度文库中如何获取分值? 追朔是什么意思? 追朔是什么意思? 追踪朔源还是追踪溯源 追踪朔源还是追踪溯源 如何才能在百度文库获得 百度文库如何获取点数 视频会议人较多时,需要通知会议人员静音设置。 有让企业微信视频会议一键全员静音的设置吗? 哪个手环支持企业微信提醒 闪光警号信号灯为持续闪烁的黄灯,提示什么 林书豪个人资料? 谁可以给我个关于介绍林书豪的网址? 谁知道林书豪啊?介绍介绍他信息吧? NBA走红了一位美籍华人林书豪&#160;请写一篇短文对其简单介绍&#160;要点包括 1.个人资料&#160;1988年8越23 想在阜新买一枚普通的开元通宝哪里买得到 网页版 开元和免费的区别 有没有知道这个开元是什么版别的,有没有价值? 开元仙域小说哪里看 这是开元通宝公元621年始铸,元字撇很有特色,请问专家,这是什么版? 做梦见自己的结婚戒指掉再游泳池了然后游泳池的水干了地上全是宝石戒指就是没有我的结婚戒指