- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
递归—回溯—搜索山东省青岛第二中 臧方青 导入练习 例1,N!。N!=N*(N-1)!,因此求N!转化为求 (N-1)!。这就是一个递归的描述。 例2:裴波那契数列的定义: 递归的概念 由函数或者过程调用引起。 一个对象部分地由它自己组成,或者是按它自己定义,我们称之是递归。 例3:汉诺塔问题:有n个半径各不相同的圆盘,按半径从大到小,自下而上依次套在A柱上,另外还有B、C两根空柱。要求将A柱上的n个圆盘全部搬到C柱上去,每次只能搬动一个盘子,且必须始终保持每根柱子上是小盘在上,大盘在下。输出总共移动的次数。 分析:在移动盘子的过程当中发现要搬动n个盘子,必须先将n-1个盘子从A柱搬到B柱去,再将A柱上的最后一个盘子搬到C柱,最后从B柱上将n-1个盘子搬到C柱去。搬动n个盘子和搬动n-1个盘子时的方法是一样的,当盘子搬到只剩一个时,递归结束。 program hannuota; var n:integer; procedure hnt(a,b,c,n:integer); begin if n=1 then writeln(a,-,c) else begin hnt(a,c,b,n-1);writeln(a,-,c);hnt(b,a,c,n-1);end; end; begin write(please input n:); read(n); hnt(1,2,3,n); end. 汉诺塔问题的递推解法 设f(n)为n 个盘子从1柱移到3柱所需移动的最少盘次。当n=1时,f(1)=1。 当n=2时,f(2)=3。 以此类推,当1柱上有n(n2)个盘子时,我们可以利用下列步骤: 第一步:先借助3柱把1柱上面的n-1个盘子移动到2柱上,所需的移动次数为f(n-1)。 第二步:然后再把1柱最下面的一个盘子移动到3柱上,只需要1次盘子。 第三步:再借助1柱把2柱上的n-1个盘子移动到3上,所需的移动次数为f(n-1)。 由以上3步得出总共移动盘子的次数为:f(n-1)+1+ f(n-1)。 所以:f(n)=2 f(n-1)+1 {现在就可以用递推做了} f(1)=1 f(2)=3 f(3)=7 f(4)=15 练习1:简单背包问题。 有一个背包容量为s,现有n件物品,重量分别为s1、s2、s3。。。Si(1=i=n),假设si均为正数,从这n件物品中选择若干件物品放入背包,使得放入总重量恰好为s,请输出一种解,若无解输出“NO ANSWER”。 练习2 快速排序 var a:array[1..10000] of longint; n,i:longint; procedure qsort(s,t:longint); var i,j,x:longint; begin i:=s;j:=t;x:=a[i]; while (ij) do begin while (ij) and (x=a[j]) do dec(j); a[i]:=a[j]; while (ij) and (a[i]=x) do inc(i); a[j]:=a[i]; end; a[i]:=x; if si-1 then qsort(s,i-1); if j+1t then qsort(j+1,t); end; 回溯法的基本思想为:在按某种搜索策略的搜索过程中,在某种状态,继续往前搜索已经确定不会得到正确答案的情况下,我们可以返回上一搜索状态,去沿新的可能性继续搜索。要回溯到上一状态,则说明我们在前进中的状态必须保存下来,我们采用“栈”来存放。 回溯与dfs的关系 在我们的实际生活和信息学奥赛当中很多问题是不能用数学公式去解决的,解决问题的过程,往往是通过一系列的步骤,在每一步中根据条件的不同,又有多种可能性,为了达到问题最终的要求,在解决过程中需要遵循某种控制策略。对于此类问题,我们往往采用搜索的方法来解决,而我们要研究的回溯法就是搜索的控制策略之一。 参考结构: procedure try(i:integer); var begin if in then 输出结果 else for j:=下界 to 上界 do begin x[i]:=h[j]; if 可行{满足限界函数和约束条件} then begin 置值;try(i+1); 取消置值;end; end; end; 例4:N皇后问题在N*N的棋盘上放置N个皇后而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。 分析: 由于皇后的摆放位置不能通过某种公式来确定,因此对于每个皇后的摆放位置都要进行试探和纠正,这就是“回溯”的思想。在N个皇后未放置完成前,摆放第I个皇后和第I+1个皇后的试探方法是相
您可能关注的文档
最近下载
- 园林绿化修剪设备.pdf VIP
- 建筑工程重点部位施工方案.docx VIP
- 口袋妖怪梦的光点全图鉴.docx
- 博林特LCM3 BLT-QS卓悦2 QS2113型电气原理图MPDK136(默纳客3000+).pdf
- 设备及压力管道防腐蚀管理制度(参考版).doc VIP
- 昆仑10号航空液压油-天空用.pptx VIP
- DBJ46-047-2018_海南省_装配式混凝土结构工程施工质量验收标准.pdf VIP
- 鲁教版(五四学制)七年级上册英语期末复习各单元知识点提纲(实用,必备!).docx VIP
- 医疗考试医学类医学基础必背考点.pdf VIP
- 《无机化学与化学分析》课程思政案例.docx VIP
文档评论(0)