穷举和递归.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
穷举和递归

1.递归法   递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。   能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。   递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。   在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。   在编写递归函数时要注意,函数中的局部变量和参数只是局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。   由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。 2.设计穷举法的关键是确定穷举对象的范围,穷举对象不能有遗漏,否则穷举不全面;确定范围后,只要将所有对象逐一列举,分别处理,就能最终解决问题。 我们用教材3.2用穷举法解决问题所给的算法解决下面班级学习小组的分组情况的例子来分析它的不妥之处。 例:安徽省固镇县湖沟中学高二(6)班共有60名同学,现在要分成若干个学习小组,规则一:每组最小N1(4)人,最多N2(7)人;规则二:如果不能平均分组,则各小组间人数之差不得多于1人。 首先按小组数穷举法确定穷举对象的范围。 最大组数Max的确定: Max=M\N1=60\4=15 分配结果总能满足条件。 最小组数Min的确定: 若M除以N2没有余数,则Min=M\N2 若M除以N2有余数,则Min=M\(N2-1)=60\(7-1)=10(组) 其次按组数(N)穷举从Min到Max之间所有可能的分配方案,进行分组时,先平均分配人数,如果余数(R)为0,说明能平均分配,直接输出分配结果,否则,将余数分散到其他组中,这样将会有N-R级M\N人,R组M\N+1人。 分组的程序流程图如右图所示: 这个问题是根据教材提供的方法来解决的,学习小组Min=10,Max=15。而实际上分9个学习小组(其中3组6人,6组7人),也是可以的。显然教材提供的方法出现了穷举对象的遗漏,穷举是不全面的。因此教材中最小组数Min的确定我个人认为应做如下变更。 最小组数Min有确定:每组以N2人试分配,若没有余数,则各组都是N2人,满足指定的两条规则;若有余数,将余数分散后将会有小组最后分得N2+1人,至少有一个小组人数将超出规则一中规定的小组人数的最值(N2),因此,这种分配方案无效,所以组数应为M\N2+1。这样就能满足指定的两条规则。由此可以确定Min的值: 若M除以N2没有余数,则Min=M\N2 若M除以N2有余数,则Min=M\N2+1 其分配算法的流程图如下: ? 同时教材中确定最小的分组数程序代码:Min=intTotal\(30-1)调整为Min=intTotal\30+1 以上为个人见解,与同行商榷。 3.问题描述:有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。 设n个物品的重量和价值分别存储于数组w[ ]和v[ ]中,限制重量为tw.考虑一个n元组(x0,x1,…,xn-1),其中xi=0 表示第i个物品没有选取,而xi=1则表示第i个物品被选取。用枚举法解决背包问题,需要枚举所有的选取方案,而根据上述方法,我们只要枚举所有的n元组,就可以得到问题的解。 显然,每个分量取值为0或1的n元组的个数共为2n个。而每个n元组其实对

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档