递归递归递归_第1页
递归递归递归_第2页
递归递归递归_第3页
递归递归递归_第4页
递归递归递归_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、模块4:非线性结构第1讲 递归第3讲 图第2讲 树型结构及二叉树第1讲递 归递归与递归程序设计 递归程序设计的应用实例 递归程序执行过程的分析 (1)直接递归在一个函数的定义中出现了对自己本身的调用。(2)间接递归一个函数p的定义中包含了对函数q的调用,而q的实现过程又调用了p,即函数调用形成了一个环状调用链。递归与递归程序设计 直接递归调用间接递归调用例1 试编一个递归函数,求正整数n的阶乘值n!。用fact(n)表示n的阶乘值,据阶乘的数学定义可知: 1 n=0或n=1 fact(n) = n*fact(n-1) n1递归函数定义的一般算法:f(x)=终了公式递归公式该问题的算法为: in

2、t Fact ( int n ) if (n=0|n=1) return 1; else return n*Fact(n-1); 递归终止条件转换成实参值不同的同一问题解 在递归程序的执行过程中,每当执行函数调用时,必须完成以下任务:(1)计算当前调用函数时的实参值;(2)为当前被调函数分配一片存储空间,并将这片存储空间的首地址压入堆栈中;(3)将当前被调函数的实参、调用后返回到主调函数代码的地址等数据存入上述所分配的存储空间中;(4)控制转到当前被调用函数的函数体,从其第一个可执行的语句开始执行。 递归程序执行过程的分析当从被调用的函数返回时,必须完成以下任务: (1)如果被调函数有返回值,

3、则记下该返回值,同时通过栈顶元素到该被调用函数对应的存储空间中取出其返回地址;(2)把分配给被调函数的那片存储空间回收,栈顶元素出栈;(3)按照被调函数的返回地址返回到调用点,若有返回值,还必须将返回值传递给调用者,并继续程序的执行。void main() long m; m=Fact(4); printf(“n 4!=%ld”,m); 递归调用过程分析:Fact (n=4)return 4*Fact(3);Fact(n=3)return 3*Fact(2);Fact(n=2)return 2*Fact(1);Fact(n=1)return 1;2624调用返回调用调用调用例2 试编一个递归函

4、数,求第n项Fibonacci级数的值。 假设使用Fibona(n)表示第n项Fibonacci级数的值, 根据Fibonacci级数的计算公式: 1 n=1 Fibona(n)= 1 n=2 Fibona(n-1)+ Fibona(n-2) n2该问题的算法为: int Fibona ( int n ) if (n=1| n=2) return 1; else return Fibona(n-1)+ Fibona(n-2); Fibona(5)S0(1)m=Fibona(4)+Fibona(3);return(m); m=Fibona(3)+Fibona(2);return(m) ;(2)m

5、=Fibona(2)+Fibona(1);return(m); (3)m=Fibona(2)+Fibona(1); return(m); 1return(1)(4)return(1)(5)return(1)(6)(7)(8)(9)return(1)return(1)(10) Fibona(5)的执行过程S1S2S311123(11)(12)(13)(14)1(15)(17)(18)52第n项Fibonacci级数的值递归程序设计具有以下两个特点:(1)具备递归出口在某种条件下,可直接给出值。递归出口定义了递归的终止条件,当程序的执行使它得到满足时,递归执行过程便终止。(2)每次递归调用,问题有

6、所简化在不满足递归出口的情况下,根据所求解问题的性质,将原问题分解成若干子问题,这些子问题的结构与原问题的结构相同,但规模较原问题小。1、 试编写一个递归函数,求两个正整数m和n的最大公约数,其中最大公约数gcd(m,n)的求解公式为: f(a,b)=b (r=a%b为0) f (b,r) ( r 0)int gcd(int a, int b) int r; r=a%b; if(r=0) return b; else return gcd(b,r) ; 递归程序设计的应用实例 2、 已知整型数组a,试编写一个递归函数,实现数组a中所有元素的逆转。例如,假设a中元素为: 56 21 34 9 12 33 2 98 16 83逆转后a中所有元素的排列顺序为: 83 16 98 2 33 12 9 34 21 56 l l+1 r-1 rvoid reverse ( int a, int l, int r ) /*将数组段al.r的元素进行逆转*/ int temp; if (lnext; if(p=NULL) return; e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论