Pascal讲授课件递归问题的多种解法解读.ppt

Pascal讲授课件递归问题的多种解法解读.ppt

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Pascal讲授课件递归问题的多种解法解读

递归问题的多种解法 数的计数 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理: l·不作任何处理: 2·在它的左边加上一个自然数,但该自然数不能超过原数的一半; 3·加上数后,继续按此规则进行处理,直到不能再产生自然数为止。 【输入】为一行,一个整数n。 【输出】为一行,满足条件数的个数。 【样例输入】6 【样例输出】6 数的计数 【问题分析】 对于任意一个数X,用变量S表示满足条件的解的个数,则S初值为1(即什么也不做);假设X前可以添加的数字为Y,则Y取值为[1..X DIV 2];假设Y前可以添加的数字为Z,则Z取值为[1..Y DIV 2];……对于每个可以取的值,将S:=S+1;递归程序如下(解题思路一)。 在计算的过程中出现了很多重复计算,例如计算X=8,要枚举[1..4],计算X=4时,要枚举[1..2],如果X的值越大,则重复计算的就越多,可以使用一个一维数组H[1..X],记录已经计算出来X的解的个数,则可以提高运算效率。参考程序(解题思路二) 解题思路一 解题思路二 program acm21102; var n,i,s:longint; procedure jisuan(x:longint); var i:longint; begin ??for i:=1 to x div 2 do ???begin ?????s:=s+1; ?????if (i div 2)0 then jisuan(i) ???end; end; begin ??readln(n); ??s:=1; ??jisuan(n); ??writeln(s); end. program acm21102; var n,i:longint; h:array[1..1000] of longint; procedure jisuan(x:longint); var i:longint; begin if h[x]0 then exit; h[x]:=1; for i:=1 to x div 2 do begin jisuan(i); h[x]:=h[x]+h[i]; end; end; begin readln(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(i div 2); program acm21102; var n,i,j:longint; h:array[1..1000] of longint; begin readln(n); fillchar(h,sizeof(h),0); for i:=1 to n do begin h[i]:=1; for j:=1 to i div 2 do h[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(i div 2) =1+S(i div 2); 算法的复杂度可以进一步降低。参考程序 program acm21102; var h,s:array[1..1001] of longint; i:longint; begin readln(n); h[1]:=1; s[1]:=1; for i:=2 to n do begin h[i]:=1+s[i div 2]; 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(i div 2); program acm21102; var h:array[1..1001] of longint; n,i:longint; begin readln(

文档评论(0)

22ffbqq + 关注
内容提供者

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

1亿VIP精品文档

相关文档