C语言(递归).ppt

  1. 1、本文档共63页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

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

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

1亿VIP精品文档

相关文档