- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
递 归 合肥市三十八中学蔡丽 重点内容 递归的概念 递归的表示 递归实现方法 用递归实现简单回溯算法 实现递归时应注意的几个方面 递归与递推的区别和联系 递归的概念 先看大家都熟悉的一个民间故事:从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事里说,从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事里说……。象这样,一个对象部分地由它自己组成,或者是按它自己定义,我们称之为递归。 一个函数、过程、概念或数学结构,如果在其定义或说明内部又直接或间接地出现有其本身的引用,则称它们是递归的或者是递归定义的。在程序设计中,过程或函数直接或者间接调用自己,就被称为递归调用。 递归的特点与应用场合 用递归方法编写的问题解决程序具有结构清晰,可读性强等优点,且递归算法的设计比非递归算法的设计往往要容易一些,所以当问题本身是递归定义的,或者问题所涉及到的数据结构是递归定义的,或者是问题的解决方法是递归形式的时候,往往采用递归算法来解决。 递归的实现方法 递归是借助于一个递归工作栈来实现. 1.递推: 问题向一极推进,这一过程叫做递推;这一过程相当于压栈. 2.回归: 问题逐一解决,最后回到原问题,这一过程叫做回归。这一过程相当于弹栈. 一个简单的实例 将n个不同颜色的球,分别放到n个不同的盒子中去,问有多少种放法? 分析: 显然所有的方法数为 n! 这样,对于任意输入的整数n,我们只要算出n!即可. 设f(n)=n!,则有, 用递归实现 N=3时的递归过程 递归的表示 Hanoi塔问题 进制转换问题 快速排序 归并排序 N皇后问题 背包问题 地图着色问题 …… 回溯法的几个重要因素 (1) 状态: 作为递归的值参。 (2) 边界条件: 作为递归的结束条件。 (3) 递归范围: 作为for循环的初值和终值。 (4) 约束条件: 满足解的条件。 (5) 最优性要求:满足最优解的条件。 N皇后问题 在N*N的棋盘上放置N个皇后而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置两个皇后),编程求解所有的摆放方法。 基本思想 由于皇后的摆放位置不能通过某种公式来确定,因此对于每个皇后的摆放位置可以进行试探; 按行放置皇后,每一行放一皇后; 对每一行所放置的皇后按列进行试探; 若某个位置能放,则放,否则试放下一个位置 若某一行没有任何一个位置可放,则表示前面的皇后没放好,需要回溯。 若n个皇后都放好了,则得到了一个解。 算法基本框架 Procedure Try(i:integer); {搜索第i行皇后的位置} var j:integer; begin if i=n+1 then 输出方案; for j:=1 to n do if 皇后能放在第i行第j列的位置 then begin 放置第i个皇后; 对放置皇后的位置进行标记; Try(i+1) 对放置皇后的位置释放标记; end; end; 边界条件设置 怎样判断某列放置了皇后 a: array [1..MaxN] of Boolean; {竖线被控制标记} 怎样判断某对角线上放置了皇后 b: array [2..MaxN * 2] of Boolean; {左上到右下斜线被控制标记} c: array [1-MaxN .. MaxN-1] of Boolean; {左下到右上斜线被控制标记} 程序 思考题1: 0,1背包问题 已知一个容量大小为M重量的背包和N种物品, 第i种物品的重量为Wi,若将物品放入背包将得到Pi的效益, 求怎样选取物品将得到效益最大。 输入数据: 从文件的第一行读入M和N,接下来N行,第i+1行的两个数分别表示第i种物品的重量和效益。 输出数据: 第一行输出一个数,表示背包所装物品的最大效益。 第二行输出若干个数字,分别表示所装物品的标号。 基本思想 按物品顺序选择放置背包;每个物品有选和不选两种可能性; 按顺序将第某件物品放进包; 如果第i件物品能放进包,则放,并更新当前最优值; 如果第i件物品不能放进包,则有可能是前面的物品不能,则需要回溯; 若每件物品都试探了一次,则输出最优解。 设置剪枝条件 设F[i]表示选第i~n个物品全部放到背包能得到的总效益。显然, F[ n ] = P n F[ i ] = F[ i+1 ]+Pi (i = 1 .. n-1) 假设当前已选到第i号物品, 如果, 当前搜索的效益值 + F[i+1] 当前的最优值,则没有必要继续搜索下去
文档评论(0)