- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言程序设计基础 2005.9 第九讲 函数(三 ) 本讲内容 算法初步 递归程序设计 分治算法与对半检索 函数内容小节 指针初步---指针变量的概念 数组 二维数组 字符型二维数组---字符串数组 数值型二维数组---矢量 C语言生长树 指针变量的类型 二进制与数据类型 变量三要素:名字、地址、字节数 输入输出函数 数组类型与结构变量 逻辑运算 if-else结构 for()结构 程序设计 初级阶段 while()结构 switch()结构 功能构件化 程序设计 基础 数据私密化 程序大纲化 c程序风格--函数、文件结构与指针 文件结构化 指针 今天的主要内容 算法初步---递归与分治算法 一个函数在它的函数体内调用它自身的过程,称为递归调用。这种函数称为递归函数。 在递归调用过程中,主调函数又是被调函数。执行递归函数将反复调用其自身。每调用一次就进入新的一层。 递归不能无限制的进行,否则会占满整个内存。如果递归函数中没有设定可以中止递归调用的出口条件,则递归过程会无限制的进行下去,最终造成系统溢出错误。 一个C语言程序是否应该设计成一个递归调用的形式,完全取决于实际应用问题本身的特性,只有在待处理对象本身具有递归结构特征的情况下,程序才应该设计为递归结构。 描述一棵树的定义如下:树是一个或多个节点组成的有限集合,其中: a)必有且仅有一个特定的称为根(root)的节点。 b) 剩下的节点被分成m≥0个互不相交的集合T1,T2,···,Tm,而且其中的每一元素又都是一棵树,称为根的子树(Subtree)。 一棵树 一棵树 递归的定义 对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决。 否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地求解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。 形式相同; 规模减小; 树的子树; void main(void) {long i,n,sum=1; printf(请输入n:\n); scanf(%d,n); for(i=1;i=n;i++)sum*=i; printf(n!=%d\n,sum); } n的阶乘 阶乘的递归求解 分治法处理问题的一个例子是求n的阶乘。从减小n的规模考虑,n的阶乘可以看成是n(n-1)! (n-1)!与求n!之间互相独立且问题形式相同:(n-1)!=(n-1)(n-2)! 。显然,这是一个递归求解过程。 因为我们追求将问题的规模一直分解到它的原子形式,也就是1!=1,同时这就是出口条件。 从底层回头,再将各子问题的解合并得到原问题的解,于是,2!=2,3!=6,…。 int main(void) { long n,sum=1; n=read(); if(n0)sum=f(n); printf(n!=%d\n,sum); } int f(int n) {if(n==1)return(1); return(n*f(n-1)); } int read() {int n; printf(请输入n值:\n); scanf(%d,n); return(n);} 阶乘函数 分解到最小问题之后的递归出口条件 问题规模的递归分解过程 这是函数与算法; 通过函数与算法的结合,建立我们解决问题、或者说程序设计的方法 int f(int n){if(n==1)return(1); return(n*f(n-1));} 当n=3的阶乘递归求解 f(3) 3*f(2) 2*f(1) f(1)=1 2*1 3*2*1 6 问题规模的递归分解过程 分解到最小问题之后的递归出口条件 回朔合并 分治法的基本思想 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 如果原问题可分割成k个子问题,1k≤n ,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。 由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这导致递归过程的产生。 分治法所能解决的问题一般具有以下几个特征: (1)问题的规模缩小到一定的程度就可以容易地解决; (2)问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 (3)利用该问题分解出的子问题的解可以合并为该问题的解。 (4)该问题所分解出的各个子问题相互独立,即子问题之间不包含公共的子子问题。 递归程序设计
您可能关注的文档
- 人教版政治高一必修二政治生活第2单元第4课第2框课件:权利的行使_需要监督(24张ppt).ppt
- 人教版语文必修二《赤壁赋》ppt课件.ppt
- 人教版选修5《有机化学基础》期末测试题.docx
- 《100以内的加法(不进位加法)》PPT课件要素.ppt
- 人教版道德与法治初一第二课第一框《学习伴成长》.ppt
- 《18我的伯父鲁迅先生》课件ppt要素.ppt
- 《2007高考复习如何解答完型填空》要素.ppt
- 人教版高一物理必修一1.3 运动快慢的描述——速度 课件 (共20张PPT).ppt
- 人教版高一政治必修一课件:第一单元 3.2 树立正确的消费观 (共26张PPT).ppt
- 人教版道德与法治七年级上册:同步课件第二单元4.2-深深浅浅话友谊-课件 (共20张PPT).ppt
文档评论(0)