c语言递归print(n 10),C语言(递归)..ppt

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值