pascal递归算法 noip竞赛材料.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阶台阶,共有多少种走法? program stair(input,output); var s,n:integer; function f(n:integer):integer; ?? begin?? if n3 then f:=n ???????? ???????else f:=f(n-1)+f(n-2); ?? end; begin ??? readln(n); ??? s:=f(n); ??? writeln(s=,s); end. 例2、骨牌铺法 有1*n的一个长方形,用一个1*1、1*2、1*3的骨牌铺满方格。例如当n=3时为1*3的方格。此时用1*1,1*2,1*3的骨牌铺满方格,共有四种铺法。图4.4.3列出了四种铺法。 ● ? ? ● ? ? ● ● ● ● ? ? ? ● ? ? ? ? ???? ● ? ? ● ? ? 输入n(0=n=30)?? 输出? 铺法总数 分析:这道题可以采用猜测法,从具体的n=1,2,3,......开始,列举出结果,根据列举的部分结果进行猜测,推导出公式。这个猜测推导过程留给读者完成。问题是:这种方法中“猜”和“凑”的成分比较多,容易出错。我们不妨采用组合数学常用的待定系数进行归纳和推导。设推导公式如下: f(n)=a*f(n-1)+b*f(n-2)+c*f(n-3)+d*f(n-4)+....(a,b,c,d...是常系数) 即1*n的长方形的铺法由全部(a种)1*(n-1)的长方形铺法总数加上全部(b种)1*(n-2)的长方形的铺法总数加上全部(c种)1*(n-3)的长方形的铺法总数......注意排除重复情况。 (1)将n格分成1格和n-1格,计算f(n-1)的系数a。右端1格的铺法有一种(a)。显然,在一格中只有一种铺法,即f(n-1)的系数a=1。 ● ? ? ● ? ? ?(2)将n格分成2格和n-2格,计算f(n-2)的系数b。右端2格的铺法有两种(b)。由图可见,(b)的铺法包含在(a)的铺法中,而(c)的铺法不同于(a),因此f(n-2)的系数b=1。 ? (3)将n格分成3格和n-3格,计算f(n-3)的系数c。右端3格的铺法有两种(图4.4.5)。由图可见,(d)(e)(f)的铺法都可以归结到1格或2格中去,只有1*3的铺法(g)属于新的,因此f(n-3)的系数c=1。 将n格分成n-x格和x格(4=x=n-4)的情况都是重复的,因此不再讨论。由此得出: f(1)=1,f(2)=2,f(3)=4, ?? f(n)=f(n-1)+f(n-2)+f(n-3)?? (n=5) 程序: var n:integer; function f(i:integer):longint; begin ? if i in[1..2] then f:=i else if i=3 then f:=4 else f:=f(I-1)+f(I-2)+f(I-3); end; begin ?? readln(n); writeln(f(n)); end. “铺砖问题”有推广价值。例如某人走n级的楼梯,每步可以走1级、2级或3级,走完n级楼梯共有多少种走法。这个问题的数学意义和解法与“铺砖问题”相同。 ? 例3: 划分问题 ? 设s是一个具有n个元素的集合s={a1,a2,…an},现将s集合划分成k个满足下列条件的子集合s1,s2,s3。。。。; ???? 1、si空; ???? 2、si∩sj=空; ???? 3、s1∪s2∪s3…. ∪sn=s?????? (1=i,j=k,ij) 则称s1,s2…sn是集合s的一个划分,它相当于把集合s中的n个元素放入k个无标号的盒子中,使得没有一个盒子为空,试确定n个元素的集合放入k个无标号盒的划分数s(n,k) 【算法分析】: ??? 例如S={1,2,3,4},k=3。细心的读者稍加分析后,不难得出S有6 种不同的划分方案,即划分数为6。其方案为 {1,2}∪{3}∪{4}??????? {1,3}∪{2}∪{4}??????? {1,4}∪{2}∪{3}??????? ????{

文档评论(0)

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

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

1亿VIP精品文档

相关文档