- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 《数据结构》国家精品课程 * 6.4 递归法求解问题 6.4.1 委员会问题 组合数学用于解决给定事件会以多少种方式发生的问题。 以经典的委员会问题为例,给出非负整数N和K,求从N个人中选出K个成员组成一个委员会的方法总数,即C(N, K)。 以N=6,K=2为例对一般问题求解。 可以穷举出共有15种不同的选择方案。假设成员名分别为A、B、C、D、E和F。 当问题规模很大时,用分治策略将问题分解为较简单的子问题。简化问题的第一步是将A从小组中拿出,这样只剩下B、C、D、E和F。 子问题1: 列出小组中剩下的5个人组成2人委员会的所有可能的组合情况。共有10种不同的子委员会,需要注意的是:每个新的委员会都不包含缺席者A。 子问题2: 列出小组中剩下的5个人组成1人委员会的所有可能情况。显然,共有5种情况,即:(B),(C),(D),(E)和(F)。每个委员会要组成2人小组还缺1人。将成员A加入其中,它们即可变成两人委员会。这些两人委员会为:(A,B),(A,C),(A,D),(A,E)和(A,F)。 可以断定子问题1和子问题2所得到的两人委员会包含了从原始问题得到的所有可能的委员会。 委员会问题的递归算法 算法COMM(n,k) COMM1[递归出口] IF k n THEN RETURN(0). ELSE IF(n = k OR k = 0) THEN RETURN(1). COMM2[递归调用] RETURN (COMM(n-1, k) + COMM(n-1, k-1))? 递归的应用--回溯(backtracking) 寻找特定问题解的一种比较可靠的方法是首先列出所有候选解,然后依次检查每一个候选解,在检查完所有或部分候选解后,即可找到所需要的解。 理论上,当候选解的数量有限并且通过检查所有或部分候选解能够得到所需要的解的时候,上述方法是可行的。 对候选解进行系统检查的方法有多种,其中回溯和分枝限界法是比较常用的两种。 6.4.2 回 溯 回溯法试图通过建立部分的解决方法来得到整个问题的解决方案。该算法可将一个局部的解决方法扩展到整个问题。 如果从局部的解决方法肯定不能得到整个问题的解决方案,也就是说局部的解将导致走进死胡同,这时就要通过移除最近加入的部分将算法回退,并且尝试其他的方法。 回溯的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。 回溯法解决的问题:货船装箱、背包、最大完备子图、旅行商和电路板排列 迷宫老鼠问题 2,1 2,2 2,3 1,1 1,2 1,3 3,1 3,2 3,3 0 0 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 (1,1)?(1,2) ?(1,3)失败,回溯到(1,2) (1,1) ?(2,1) ?(3,1) ?(3,2) ?(3,3) 迷宫问题 小型迷宫 路口 动作 结果 1(入口) 正向走 进到 2 2 左拐弯 进到 3 3 右拐弯 进到 4 4(堵死) 回溯 退到 3 3(堵死) 回溯 退到 2 2 正向走 进到 5 5(堵死) 回溯 退到 2 2 右拐弯 进到 6 6 左拐弯 进到 7 (出口) 7 6 4 3 5 2 1 例:n-皇后问题 在国际象棋中,最强大的棋子是皇后,因为她能攻击她所在行、所在列内或沿对角方向的任何一个棋子。n-皇后问题要求在棋盘上放置n个皇后,使得没有哪个皇后能攻击其他的皇后。 在回溯中,由于每个皇后都必须放置在不同的行中,所以n-皇后问题的解决方案可以表示为一个n元组(x1, … , xn),这里的xi 是把第i个皇后放在第i行的列数且1 ≤xi ≤n. 由于任何两个皇后都不能出现在同一列中,因此n元组(x1, … , xn)中没有两个元素是相同的。 那么,应该如何判断两个皇后是否在同一斜角线上呢? 如果设想棋盘的方格像二维数组A(1: n, 1: n)的下标那样标记,对于在同一条斜角线上的由左上方到右下方的每一个元素都有相同的“行?列”值,同样,在同一
文档评论(0)