Pascal讲授递归问题多种解法.pptVIP

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

递归问题的多种解法

数的计数我们要求找出具有下列性质数的个数(包含输入的自然数n):先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理:l·不作任何处理:2·在它的左边加上一个自然数,但该自然数不能超过原数的一半;3·加上数后,继续按此规则进行处理,直到不能再产生自然数为止。【输入】为一行,一个整数n。【输出】为一行,满足条件数的个数。【样例输入】6【样例输出】6

数的计数【问题分析】对于任意一个数X,用变量S表示满足条件的解的个数,则S初值为1(即什么也不做);假设X前可以添加的数字为Y,则Y取值为[1..XDIV2];假设Y前可以添加的数字为Z,则Z取值为[1..YDIV2];……对于每个可以取的值,将S:=S+1;递归程序如下(解题思路一)。在计算的过程中出现了很多重复计算,例如计算X=8,要枚举[1..4],计算X=4时,要枚举[1..2],如果X的值越大,则重复计算的就越多,可以使用一个一维数组H[1..X],记录已经计算出来X的解的个数,则可以提高运算效率。参考程序(解题思路二)

解题思路一解题思路二programacm21102;varn,i,s:longint;procedurejisuan(x:longint);vari:longint;begin??fori:=1toxdiv2do???begin?????s:=s+1;?????if(idiv2)0thenjisuan(i)???end;end;begin??readln(n);??s:=1;??jisuan(n);??writeln(s);end.programacm21102;varn,i:longint;h:array[1..1000]oflongint;procedurejisuan(x:longint);vari:longint;beginifh[x]0thenexit;h[x]:=1;fori:=1toxdiv2dobeginjisuan(i);h[x]:=h[x]+h[i];end;end;beginreadln(n);fillchar(h,sizeof(h),0);jisuan(n);writeln(h[n]);end.

解题思路三采用递推思路。用H(n)表示自然数n所能扩展的数据个数,则h(1)=1;h(2)=2;h(3)=2;h(4)=4;h(5)=4;h(6)=6;h(7)=6;……归纳递推公式:h(i)=1+h(1)+h(2)+……+h(idiv2);programacm21102;varn,i,j:longint;h:array[1..1000]oflongint;beginreadln(n);fillchar(h,sizeof(h),0);fori:=1tondobeginh[i]:=1;forj:=1toidiv2doh[i]:=h[i]+h[j];end;writeln(h[n]);end.

解题思路四在思路三的基础上,我们定义一个S,令S(x)=h(1)+h(2)+……+h(x);则S(x-1)=h(1)+h(2)+……+h(x-1);h(x)=S(x)-S(x-1);h(x)=h(i)=1+h(1)+h(2)+……+h(idiv2)=1+S(idiv2);算法的复杂度可以进一步降低。参考程序programacm21102;varh,s:array[1..1001]oflongint;i:longint;beginreadln(n);h[1]:=1;s[1]:=1;fori:=2tondobeginh[i]:=1+s[idiv2];s[i]:=s[i-1]+h[i];end;writeln(h[n]);end.

解题思路五进一步分析,可以得到以下的递推公式:(1)当i为奇数时,h(i)=h(i-1);(2)当i为偶数时,h(i)=h(i-1)+h(idiv2);programacm21102;varh:array[1..1001]oflongint;n,i:longint;beginreadln(n);h[1]:=1;fori:=2tondoifimod2=0thenh[i]:=h[i-1]+h[idiv2]elseh[i]:=h[i-1];wr

文档评论(0)

可爱的家人6536 + 关注
实名认证
文档贡献者

可爱的家人

1亿VIP精品文档

相关文档