- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章 栈和
while(!Empty_SeqQueue(DancerQ)) { Out_SeqQueue (DancerQ, e); In_SeqQueue(ManQ,e); In_SeqQueue(WomanQ,e); }//舞曲结束,配对拆开进各自队列 printf(下一轮开始:\n); } //经过Count轮后结束结束 } 关于迷宫问题 请大家自行阅读,对比三种解法 用栈 P60 :回溯的思想 用递归 P74 ;将问题的规模逐步缩小 用队列 :自己查找相关资料 返回 3、递归过程中的调用和返回 递归函数的递归过程:在递归进层(i→i +1层)时系统需要做三件事: ⑴ 保留本层参数与返回地址(将所有的实在参数、返回地址等信息传递给被调用函数保存); ⑵ 给下层参数赋值(为被调用函数的局部变量分配存储区); ⑶ 将程序转移到被调函数的入口。 而从被调用函数返回调用函数之前,递归退层(i←i +1层)系统也应完成三件工作: ⑴ 保存被调函数的计算结果; ⑵ 恢复上层参数(释放被调函数的数据区); ⑶ 依照被调函数保存的返回地址,将控制转移回调用函数。 N!递归调用过程示意图 4、递归函数的非递归化 递归算法具有两个特性: 递归算法是一种分而治之、把复杂问题分解为简单问题的求解方法,对求解某些复杂问题,递归算法是有效的。 递归算法的时间效率差,因为需要不断地进栈和出栈。 有两类消除递归方法 一类是简单递归问题的转换,用循环结构的算法替代 另一类是基于栈的方式,即将递归中隐含的栈机制转化为由用户直接控制的明显的栈,利用堆栈保存参数,由于堆栈的后进先出特性吻合递归算法的执行过程,因而可以用非递归算法替代递归算法 I 简单递归问题的转换 如n的阶乘: 因此可以不用递归而直接利用循环来解决问题 II 基于栈的方式转换 求n的阶乘的递归函数参数只有一个,递归调用只出现在return语句中,无论哪次调用返回地址总是程序中与n相乘的位置,不必每次调用时都保存,因此栈中只要保存参数n即可 用栈算法如下页所示 while(n0) { Push-_SeqStack (S,n); n--; } result=1; while(!(Empty_SeqStack(S))) { Pop_SeqStack(S,temp) result*=temp; } Destroy_ SeqStack (S); return (result) ; } typedef int DataType; int fact(int n) { int result,temp; PSeqStack S; S=Init_SeqStack(); /*初始化栈*/ if (!S) { printf(“栈初始化失败”); return(0); } 5、递归设计举例 【例3.4】 用递归写出求数组中n个元素之和 求n个元素的和与求n-1个元素的和是相同的过程 int sum(int a[],int n) { /*求数组a中的n个元素之和*/ if(n=0) /*最小尺度当n=0,数组a中无元素,和为0*/ return 0; else return(sum(a,n-1)+a[n-1]); /*否则应该是数组中的第n个元素和n-1个元素之和*/ } 例3.5 用递归写出全排列问题求解算法 分析: 设R={r1,r2,…,rn}是要进行排列的n个元素,集合X中元素的全排列记为Perm(X) Ri=R-{ri} 。 (ri) Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列 则:R的全排列可归纳定义如下: 当n=1时,Perm( R ) = ( r ) , 其中r是集合R中惟一的元素; 当n1时,Perm( R ) 由 (r1)Perm(R1), (r2)Perm(R2),…,(rn)Perm(Rn) 构成。 算法如下页所示 产生Perm( R ) 的递归算法如下,设R为一整型数组int list[N] void Perm( int list[], int k, int m,int num) {/*求下标k 至m元素的全排列,num为k~m的数的个数*/ int i; if(k
您可能关注的文档
最近下载
- 2024年山东省生态环境监测专业技术人员大比武理论试题库资料(含答案).pdf VIP
- 花篮式悬挑脚手架施工方案.docx VIP
- 台达变频器cp2000使用说明书新.pdf
- 基于知识图谱构建下一代CMDB.pdf VIP
- 危险化学品建设项目竣工验收报告.docx VIP
- 通信行业“泽字节”时代投资报告系列一:硅光,“超越摩尔”新路径,厚积薄发大未来.pdf
- 2025年度专业技术人员继续教育公需科目考试题(附答案).doc VIP
- 花篮式悬挑脚手架施工方案.pdf VIP
- 山东春考英语真题.docx VIP
- T_CACM 1225-2019 中医整脊科临床诊疗指南 骶髂关节错缝症.docx VIP
文档评论(0)