为了账号安全,请及时绑定邮箱和手机立即绑定

请帮我解释下这个函数是怎么求出步骤的,谢谢

请帮我解释下这个函数是怎么求出步骤的,谢谢

C PHP
陪伴而非守候 2022-09-02 14:10:12
问题是这样的:有三根针ABC,A针上有n个盘子,大小不等,大的在下小的在上.要求把这n个盘子从A针移到C针,可以借助B针,每次只能移动1个盘子,且在移动过程中3根针上都要保证大盘在下小盘在上.具体的调用函数是:void move (getone,putone)char getone ,putone;{printf("%c----%c\n",getone,put);}void hanoi (n,one,two,three)char one,two,three;int n;{if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}}主函数没什么实际用途就是把步骤输出,我就不打了我是个初学者,刚刚看到递归调用这里,有些不懂
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

首先我来解释一下汉诺塔的原理:
当搬运的碟子数n=1时,直接搬运即可;当n>1时,要把n个碟子从针1搬运到针3,则必须通过针2(即需要一个独立于源针和目的针的中间针,用来辅助);假设我们已经成功的把上面较小的n-1个碟子搬运到了针2,那么我们只需要再把第n个碟子(底层最大的那个)搬运到针3,再把针2的n-1个碟子搬运到针3,那么这n个碟子塔就成功的搬运到了针3了.而整个n-1的塔要怎么搬运呢?这就是递归啦
所以整个步骤:
1.搬运n-1个碟子到中间针(递归)
2.搬运第n个碟子到目的针
3.搬运中间针的n-1个碟子到目的针(递归)

void move (getone,putone)
函数的作用是用于搬运最底层的第n个碟子,从getone针搬到putone针

void hanoi (n,one,two,three)
函数的作用是,把n层塔从one针(源)搬运到three针(目的),用two针来辅助(中间)

所以上面的步骤就可以翻译成c语言了
要想把n个碟子从one针搬运到three针的三个步骤:
(与第一段陈述的三个步骤对应,即hanoi(n,one,two,three)函数要完成的功能,函数主体)
1.hanoi(n-1,one,three,two);是递归调用,如果n-1>1则它又会去执行3个步骤,以至于无穷
2.move(one,three);这一步是具体移动,所以要输出移动方法,让用户能看见移动方向
3.hanoi(n-1,two,one,three);递归

递归调用只要有整体观念就行了,你在写代码的过程中可以把"移动n-1个塔"看作一步完成的,至于这步是怎么完成的,会由计算机逐级递归展开函数栈具体实现,我们不必多想.因为每一级的过程都是一样的,所以用递归,减少代码规模

递归的思想相对较容易,即只看见本层次,低层次由于过程和本层完全相同,调用递归函数自身,来重复利用代码.由于会函数嵌套调用会有多余的时间空间耗费,所以在递归次数过大等情况下,尽量用非递归的方法实现.


查看完整回答
反对 回复 2022-09-06
?
FFIVE

TA贡献1797条经验 获得超6个赞

AutoFlowchart 是一个极佳的根据源程序生成流程图的工具,主要用于对已有的程序进行分析,并为制作项目文档做准备。它生成的流程图支持展开/合拢,缩放和移动也很方便,并且可以预设流程图的长宽和纵向横向间距。你可以将流程图导出到WORD文档或Bmp图像文件。
它是软件AgFlowchart的换代产品,它修正了一些AgFlowchart的bug,并且增加了许多新的功能。
它支持C,C++,VC++(Visual C++ .NET),Delphi(Object Pascal).

根据源程序生成流程图
导出流程图到WORD文档中
展开/合拢流程图
自动生成一个 TreeView显示所有函数/过程
同步显示对应块的源程序和流程图
自定义流程图的配色方案
自定义流程图的大小和间距
根据格式自动排列程序
自由缩小、放大、移动流程图
显示程序行号
支持清除当前流程图
导出流程图到*.bmp文件



查看完整回答
反对 回复 2022-09-06
?
森栏

TA贡献1810条经验 获得超5个赞

为了便于理解,先分析将A座上的3个盘子移到C座上的过程:
(1) 将A座上2个盘子移到B座上(借助C);
(2) 将A座上的1个盘子移到C座上;
(3) 将B座上的2个盘子移到C座上(借助A);
其中第(2)步可以直接实现。第(1)步可以用递归方法分解为:
1、将A上一个盘子从A移到C;
2、将A上1个盘子从A移到B;
3、将C上1个盘子从C移到B;
第(3)步可以分解为:
3.1将B上一个盘子从B移到A上;
3.2将B上一个盘子从B移到C上;
3.3将A上一个盘子从A移到C上;
将以上综合起来,可得到移到3个盘子的步骤为:
A→C,A→B,C→B,A→C,B→A,B→C,A→C.
由上面的分析可知:将n个盘子从A座一定哦C座可以分解以下3个步骤:
(1)将A上n-1个盘借助C移到B座上;
(2)把A座上剩下的一个盘移到C座上
(3)将n-1个盘从B座借助A座移到C座上。
上面第(1)步和第(3)步,都是把n-1个盘从一个座移到另一个座上,采取的办法是一样的,只是座名不同而已。为使之简化,可以将第(1)步和第(3)步表示为:
将“one”座上的n-1个盘移到“two”座(借助“three”座),只是在第(1)步和第(3)步中,one two three和A B C对应关系不一样。对第(1)步one 对应A,two对应B,three对应C。第(3)步是:one 对B,two 对应C,three对应A。


查看完整回答
反对 回复 2022-09-06
  • 3 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号