网站大量收购独家精品文档,联系QQ:2885784924

递归与回溯.ppt

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

递 归 重点内容 递归的概念 递归的表示 递归实现方法 用递归实现简单回溯算法 实现递归时应注意的几个方面 递归与递推的区别和联系 递归的概念 先看大家都熟悉的一个民间故事:从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事里说,从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事里说……。象这样,一个对象部分地由它自己组成,或者是按它自己定义,我们称之为递归。 一个函数、过程、概念或数学结构,如果在其定义或说明内部又直接或间接地出现有其本身的引用,则称它们是递归的或者是递归定义的。在程序设计中,过程或函数直接或者间接调用自己,就被称为递归调用。 递归的特点与应用场合 用递归方法编写的问题解决程序具有结构清晰,可读性强等优点,且递归算法的设计比非递归算法的设计往往要容易一些,所以当问题本身是递归定义的,或者问题所涉及到的数据结构是递归定义的,或者是问题的解决方法是递归形式的时候,往往采用递归算法来解决。 递归的实现方法 递归是借助于一个递归工作栈来实现. 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到N的N个连续的自然数,求出这N个自然数的各种全排列。如N=3时,共有以下6种排列方式: 123,132,213,231,312,321。 注意:数字不能重复,N由键盘输入(N=9)。 思考题2:构造字串 生成长度为n的字串,其字符从26个英文字母的前p(p≤26)个字母中选取,使得没有相邻的子序列相等。例如p=3,n=5时 ‘a b c b a’满足条件 ‘a b c b c’不满足条件 输入:n,p 输出:所有满足条件的字串 分析 状态:待扩展的字母序号i。 由于该变量的存储量太大,因此我们将s设为全局变量; 边界条件:产生了一个满足条件的字串,即 i=n+1; 搜索范围:从’a’开始的后p个字符; 约束条件:当前字串没有相邻子串相等的情况 procedure solve (i: integer); var j, k: integer; t : longint ; begin if i=n+1 then {若产生了一个满足条

文档评论(0)

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

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

1亿VIP精品文档

相关文档