第3章栈与队列C.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 3.3 栈与递归 第三章 栈和队列 * 3.3 栈与递归 当一个函数调用另一个函数时,在调用之前系统要做3件事: 1.将所有的实在参数、返回地址等信息传递给被调用函数保存; 2.为被调用函数的局部变量分配存储空间;(入栈) 3.将控制转移到被调用函数的入口。 1.保存被调用函数的计算结果; 2.释放被调用函数的数据区;(出栈) 3.依照被调用函数保存的地址将控制转移到调用函数。 返回时,系统要做3件事: * 例如:给出如下程序 void first(int s,int t); void second(int d); void main( ){ int m,n; … first(m,n); 1: … } int first(int s,int t){ int i; … second(i); 2: … } int second(int d){ int x,y; … } * 3.3 栈与递归 什么是递归(复习) 递归定义:简单地说,一个用自己定义自己的概念,称为递归定义。或者说调用函数和被调用函数是同一个函数。 例 n!= 1* 2* 3* 4 * (n-1)* n n!递归定义 n!= 1 当 n=1 时 n!= n (n-1)! 当 n1 时 * 3.递归算法的编写 1)将问题用递归的方式描述(定义) 2)根据问题的递归描述(定义)编写递归算法 ?问题的递归描述(定义) 递归定义包括两项 基本项(终止项):描述递归终止时问题的求解; 递归项:将问题分解为与原问题性质相同,但规模较小的问题; 例:n!的递归定义 基本项: n!=1 当 n=1 递归项: n!=n (n-1)!? 当 n1 用(n-1)!定义n! * 例1 编写求解 n! 的递归算法 首先给出阶乘n! 的递归定义 ? n!的递归定义 基本项: n!=1 当 n=1 递归项: n!=n (n-1)!? 当 n 1 int fact(int n) { //算法功能是求解并返回n的阶乘 if(n==1) return(1); else return(n*fact(n-1)); } * 递归执行的过程: * 3.3 栈与递归 我们看一下n=3 阶乘函数fact(n)的执行过程 Main( ) { int n=3,y; L y= fact(n); } 调用 调用 调用 int fact (n) { If(n==1) return(1); Else L1 return(n*fact (n-1)); } n=3 int fact (int n) { If(n==1) return(1); Else L1 return(n*fact (n-1)); } n=2 int fact (int n) { If(n==1) return(1); Else L1 return(n*fact (n-1)); } n=1 L n L1 2 n L1 3 n 返 回 1 返回2 返 回 6 1 n*fact (n-1) n*fact (n-1) fact(n) 返回地址 实参 注意递归调用中 栈的变化 3 y * 递归的其他方面: * 3.3 栈与递归 作业:编程题 裴波那契(Fibonacci)数列的定义为:它的第1项和第2项均为1,以后各项为其前两项之和。若裴波那契数列中的第n项用Fib(n)表示,则计算公式为: ? 1 (n=1或2) Fib(n)=? ? Fib(n-1)+Fib(n-2) (n=2) 试编写出计算Fib(n)的递归算法和非递归算法。 * 递归算法: long Fib( int n ) { if ( n==1 || n==2 ) // 终止递归条件 return 1; else return Fib(n-1)+Fib(n-2); }

文档评论(0)

jyr0221 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档