- 1、本文档共64页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3单元递归附加
1) 单链表是一种顺序结构,必须从第一个结点起,逐个检查每个结点的数据元素; 分析: 2) 从另一角度看,链表又是一个递归结构,若 L 是线性链表 (a1, a2, ?, an) 的头指针,则 L-next是线性链表 (a2, ?, an)的头指针。 a1 a2 a3 an … ? L 例如: a1 a2 a3 an ? L a1 a2 a3 an ? L 已知下列链表 1) “a1=x”,则 L 仍为删除 x 后的链表头指针 2) “a1≠x”,则余下问题是考虑以 L-next 为头指针的链表 … … a1 L-next L-next=p-next p=L-next void delete(LinkList L, ElemType x) { // 删除以L为头指针的带头结点的单链表中 // 所有值为x的数据元素 if (L-next) { if (L-next-data==x) { p=L-next; L-next=p-next; free(p); delete(L, x); } else delete(L-next, x); } } // delete 5.3 递归算法到非递归算法的转换 递归算法有两个基本特性:一是递归算法是一种分而治之的、把复杂问题分解为简单问题的求解问题方法,对求解某些复杂问题,递归算法分析问题的方法是十分有效的;二是递归算法的时间/空间效率通常比较差。 当在一个函数的运行期间调用另一个函数时,在运行该被调用函数之前,需先完成三项任务: 将所有的实在参数、返回地址等信息传递给被调用函数保存; 为被调用函数的局部变量分配存储区; 将控制转移到被调用函数的入口 保存被调函数的计算结果; 释放被调函数的数据区; 依照被调函数保存的返回地址将控制转移到调用函数。 从被调用函数返回调用函数之前,应该完成下列三项任务: 多个函数嵌套调用的规则是: 此时的内存管理实行“栈式管理” 后调用先返回 ! 例如: void main( ){ void a( ){ void b( ){ … … … a( ); b( ); … … }//main }// a }// b Main的数据区 函数a的数据区 函数b的数据区 递归工作栈:递归过程执行过程中占用的 数据区。 递归工作记录:每一层的递归参数合成 一个记录。 当前活动记录:栈顶记录指示当前层的 执行情况。 当前环境指针:递归工作栈的栈顶指针。 递归函数执行的过程可视为同一函数进行嵌套调用,例如: 例1 递归的执行情况分析--n! int fact (int w) { int fact; if ( w==0) fact= 1; else fact=w* fact ( w-1); return fact; } main() { int f; f=fact(3); print(f); } int fact (int w) {1if ( w==0) 2 fact= 1; 3else 4fact=w* fact( w-1); } 地址 w top 递归调用执行情况如下: int fact (int w) {1if ( w==0) 2 fact= 1; 3else 4fact=w* fact( w-1); } 地址 w 3 3*fact(2); 4 w=3 top w 递归调用执行情况如下: int fact (int w) {1if ( w==0) 2 fact= 1; 3else 4fact=w* fact( w-1); } 3 3*fact(2); w 2 2*fact(1)
文档评论(0)