- 1、本文档共63页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言(递归)
2005-1-2 C语言程序设计进阶 C语言程序设计尹宝林 第四讲:递归 递归的概念和作用 概念或函数直接或间接引用自身 在可计算性理论中有重要的地位 递归可枚举 常用的重要机制 概念的表达 数据结构和算法的描述 重要的思维方式 现代程序设计语言中都提供支持 递归概念的例 树 树的非递归定义 连通且无圈的无向图 树的递归定义 一个节点是一棵树 一棵树的每个节点可以有m个分支,其中每一个分支都是一棵树 一棵树中的任意两个节点间只有一条通路 递归算法的例 排序 归并排序(merge sort) 最典型常用的实现方法是通过递归的定义 快速排序算法(quick sort) 直接通过递归定义 递归函数的例 直接引用的递归函数:对树的中序遍历 typedef struct t_node { int value; struct t_node *l_tree, *r_tree; } t_node; void treat_tree(t_node *treep, void (*op_func)(int)) { if (treep == NULL) return; treat_tree(treep-l_tree, op_func); op_func(treep-value); treat_tree(treep-r_tree, op_func); } 递归函数的例(续) 间接引用的递归函数 void a(int i) { … … b(i – 1); } void b(int i) { … … a(i); } 递归函数的例(续) 递归曲线 Hilbert曲线 Sierpinski曲线 分形(fractal) 递归在程序设计中的例 程序设计语言的语法描述 Backus-Naur Form (巴克斯范式) Algol、C、… … 数据结构 控件 复杂的嵌套结构 … … 递归的优点 概念清晰,易于理解 描述简单,易于实现 例:GUI中的嵌套的选单(Menu) 代码紧凑,易于维护 递归函数的缺点 在某些情况下计算复杂度较高 不适当的定义引起的重复计算 在某些情况下占用存储空间较多 深度递归调用引起的资源消耗 函数调用的开销 计算过程简单时函数调用开销的比例增加 理解和使用递归的难点 递归的基本思维方法 递归概念的表示 使用递归方法求解问题 递归过程的描述方法 递归的执行过程 递归的使用条件和环境 在什么情况下应该使用递归 递归概念的表示 自引用结构 例1:二叉树的表示 typedef struct tree_node { int value; struct tree_node *l_tree; struct tree_node *r_tree; } tree_node; 例2:单向链表的表示 typedef struct list { int value; struct list *next; } list; 递归过程描述的基本思想 把问题化为形式相同但规模较小的问题 在问题规模缩小到一定的程度时加以解决 递归的描述 定义对问题可以直接求解的情况和方法 用自引用的方式描述问题的一般求解过程 在对自身的引用过程中降低问题的复杂度 在复杂度降低到一定程度时直接求解 递归过程描述的基本思想(续) 与数学归纳法类似 数学归纳法 在证明一个关于整数的公式时 证明该公式对一个整数k成立 假设该公式对某一整数n成立 证明该公式对整数n+1成立 递归过程的描述步骤 确定递归参数 定义递归的终止条件和基础计算 当递归参数为一个确定的值时应当如何直接进行计算 定义递归调用 当递归参数不满足终止条件时,将计算表示为包含对自身调用的计算 对自身调用时递归参数应更接近终止条件 递归过程描述的例 阶乘 0! = 1 n! = n * (n – 1)! 组合公式 Cm1 = m Cmm = 1 Cmn = Cnm-1 + Cn-1m-1 递归过程描述的例(续) 梵塔 初始状态: N个(N 0)大小不同的圆盘插在柱A上,大盘在下,小盘在上。柱B和柱C上为空 任务: 将所有的圆盘移到柱B上,仍保持大盘在下,小盘在上的状态 限制条件: 每次只能移动一个盘 可以把圆盘临时放在任一柱上,但大盘不能压住小盘 递归过程描述的例(续) 梵塔问题递归求解的思路 当n等于1时 直接将盘由柱A移至柱B 当n大于1时 将顶部的n – 1个盘由柱A移至柱C 将底部的大盘由柱A移至柱B 将柱C上的n – 1个盘移至柱B 递归函数的基本结构 基础计算 递归的基础条件(终止条件) 递归的基础计算 递归调用 直接或间接的对自身的引用 对递归控制参数的修改 向着递归终止条件方向变化 递归调用时的其它计算 计算 n 的阶乘 int factorial(int
您可能关注的文档
- Shared Memory Parallelism.ppt
- Esopha-function disease.ppt
- Ws07_parasolid.ppt
- Thinking in Hadoop.pptx
- JSP程序开发.ppt
- 会计从业练习题 5页.doc
- Excel 序号排列(一)20110620.ppt
- 1-3习题答案.ppt
- Java _mianshi.doc
- GridSim例8.doc
- 10《那一年,面包飘香》教案.docx
- 13 花钟 教学设计-2023-2024学年三年级下册语文统编版.docx
- 2024-2025学年中职学校心理健康教育与霸凌预防的设计.docx
- 2024-2025学年中职生反思与行动的反霸凌教学设计.docx
- 2023-2024学年人教版小学数学一年级上册5.docx
- 4.1.1 线段、射线、直线 教学设计 2024-2025学年北师大版七年级数学上册.docx
- 川教版(2024)三年级上册 2.2在线导航选路线 教案.docx
- Unit 8 Dolls (教学设计)-2024-2025学年译林版(三起)英语四年级上册.docx
- 高一上学期体育与健康人教版 “贪吃蛇”耐久跑 教案.docx
- 第1课时 亿以内数的认识(教学设计)-2024-2025学年四年级上册数学人教版.docx
最近下载
- 海港总体设计规范,JTS165-2013.docx
- 六年级上册语文-晨读晚默(33页).pdf
- 2019年昆明呈贡公园概念设计(城市规划、景观园林专业资料).ppt
- 2023-2024在线学习课堂网课《伤寒论临证应用规律解析》单元测试考核答案.pdf
- v20变频器说明书.pdf
- 食品安全风险管控清单(蛋制品生产).docx VIP
- 药事管理与合理用药的现状及临床分析.docx
- ASUS华硕主板玩家国度(ROG)ROG MAXIMUS Z790 EXTREME 简体中文版使用手册.pdf
- “双带头人”教师党支部书记工作室申报书.docx VIP
- 2023年北京中考数学重难题型01新定义创新型综合压轴问题(13-22年最后一题+真题10道模拟30道)含详解.pdf VIP
文档评论(0)