- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 栈和队列 3.3 栈与递归 例如:给出如下程序 void first(int s,int t); void second(int d); void main( ){ int m,n; … first(m,n); 1: … } 3.3 栈与递归 递归执行的过程: 递归的其他方面: 3.3 栈与递归 * 3.3 栈与递归 当一个函数调用另一个函数时,在调用之前系统要做3件事: 1.将所有的实在参数、返回地址等信息传递给被调用函数保存; 2.为被调用函数的局部变量分配存储空间;(入栈) 3.将控制转移到被调用函数的入口。 1.保存被调用函数的计算结果; 2.释放被调用函数的数据区;(出栈) 3.依照被调用函数保存的地址将控制转移到调用函数。 返回时,系统要做3件事: int first(int s,int t){ int i; … second(i); 2: … } int second(int d){ int x,y; … } 什么是递归(复习) 递归定义:简单地说,一个用自己定义自己的概念,称为递归定义。或者说调用函数和被调用函数是同一个函数。 例 n!= 1* 2* 3* 4 * (n-1)* n n!递归定义 n!= 1 当 n=0 时 n!= n (n-1)! 当 n0 时 3.递归算法的编写 1)将问题用递归的方式描述(定义) 2)根据问题的递归描述(定义)编写递归算法 ?问题的递归描述(定义) 递归定义包括两项 基本项(终止项):描述递归终止时问题的求解; 递归项:将问题分解为与原问题性质相同,但规模较小的问题; 例:n!的递归定义 基本项: n!=1 当 n=0 递归项: n!=n (n-1)!? 当 n 0 用(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 作业:编程题 裴波那契(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)