C语言递归算法.ppt

  1. 1、本文档共117页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言递归算法

计算机语言与程序设计;第八章 递归算法;从前有座山,山上有座庙,庙里有一个老和尚 和一个小和尚,老和尚正在给小和尚讲故事。 讲的是什么故事呢?他说,从前……;Recursion - See Recursion. In order to understand recursion, one must first understand recursion. ;C语言允许嵌套地调用函数,也就是说,在调用 一个函数的过程中,又去调用另一个函数。;函数的嵌套调用有一个特例,即递归调用,也就 是说,在调用一个函数的过程中,又出现了直接 或间接地去调用该函数本身。;void tell_story( ) { static int old_monk, young_monk; old_monk = old_monk + 1; // 年龄大了一岁 young_monk = young_monk + 1; if(old_monk = 60) // 递归形式 tell_story ( ); else printf(对不起,已退休!); // 递归边界 };在语法上(简单) 递归即为普通的函数调用。 在算法上(难) 如何找到递归形式? 如何找到递归边界?;递归算法的类型;第八章 递归算法;分而治之(divide-and-conquer)的算法 设计思想: Divide:把问题划分为若干个子问题; Conquer:以同样的方式分别去处理各个子问题; Combine:把各个子问题的处理结果综合起来,形成最终的处理结果。;玛特露什卡;……;如何编写基于分治策略的递归程序? 在算法分析上,要建立分治递归的思维方式。 在编程实现上,要建立递归信心(To turst the recursion, Jerry Cain, stanford)。; 如何建立分治递归的思维方式? 基本原则:目标驱动! 计算n!:n! = n * (n-1)!,且1! = 1。;调用;void main( ) { int n; printf(请输入一个整数:); scanf(%d, n); printf(%d! = %d \n, n, fact(n)); } int fact(int n) { if(n == 1) return(1); else return(n * fact(n-1)); };调用和返回的递归示意图; 如何建立递归信心? 函数的递归调用到底是如何进行的呢?在递归调用时,执行的是不是相同的代码?访问的是不是相同的数据?如果是的话,那么大家会不会相互干扰、相互妨碍?;main的栈帧;8.2.2 寻找最大值;如何来设计相应的递归算法? 目标:max{a[0], a[1], … a[n-1]} 可分解为:max{a[0], max{a[1], … a[n-1]}} 另外已知max{x} = x 这就是递归算法的递归形式和递归边界,据 此可以编写出相应的递归函数。;int Max(int a[], int first, int n) { int max; if(first == n-1) return a[first]; max = Max(a, first+1, n); if(max a[first]) return a[first]; else return max; };8.2.3 折半查找法;前提:数据是有序排列的; 基本思路: 将目标值与数组的中间元素进行比较; 若相等,查找成功。否则根据比较的结果将查找范围缩小一半,然后重复此过程。;4120243;4120243;4120243;4120243;4120243;void main() { int b[] = {05, 13, 19, 21, 37, 56, 64, 75, 80, 88, 92}; int x = 21; printf(x位于数组的第%d个元素\n, bsearch(b, x, 0, 10)); };函数原型: int bsearch(int b[], int x, int L, int R); 递归的形式? 递归的边界?;int bsearch(int b[], int x, int L, int R) { int mid; if(

文档评论(0)

f8r9t5c + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档