算法设计与分析实验一

上传人:zhu****ng 文档编号:115933040 上传时间:2022-07-04 格式:DOC 页数:16 大小:184.50KB
收藏 版权申诉 举报 下载
算法设计与分析实验一_第1页
第1页 / 共16页
算法设计与分析实验一_第2页
第2页 / 共16页
算法设计与分析实验一_第3页
第3页 / 共16页
资源描述:

《算法设计与分析实验一》由会员分享,可在线阅读,更多相关《算法设计与分析实验一(16页珍藏版)》请在装配图网上搜索。

1、学 号 1421050102算法设计与分析实验报告一学生姓名Cherish专业、班级地理指导教师唐国峰成绩计算机与信息工程学院软件工程系2017 年 3 月 14 日实验一:递归策略运用练习一、实验目的本次实验是针对递归算法的算法设计及应用练习,旨在加深学生对该算法原理的理解,提高学生运用该算法解决问题的能力。二、实验步骤与要求1实验前复习课程所学知识以及阅读和理解指定的课外阅读材料;2学生独自完成实验指定内容;3实验结束后,用统一的实验报告模板编写实验报告。4提交说明: (1)电子版提交说明:a 需要提交Winrar压缩包,文件名为“算法设计与分析实验一_学号_姓名”,如“算法设计与分析实验

2、一_09290101_张三”。 b 压缩包内为一个“算法设计与分析实验一_学号_姓名”命名的顶层文件夹,其下为两个文件夹,一个文件夹命名为“源程序”,另一个文件夹命名为“实验报告电子版”。其下分别放置对应实验成果物。 (2)打印版提交说明:a 不可随意更改模板样式。 b 字体:中文为宋体,大小为10号字,英文为Time New Roman,大小为10号字。 c 行间距:单倍行距。(3)提交截止时间:2017年3月28日16:00。三、 实验项目1运用递归策略设计算法实现下述题目的求解过程。题目列表如下:【必做题】 (1)运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二

3、天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。 (2)国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;给第i个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份?(3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余

4、金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。问这鱼缸里原有多少条金鱼?(4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?(5)猴子吃桃。有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?(6)小

5、华读书。第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此,第六天读完了最后的三页,问全书有多少钱页?(7)日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?(8)某种传染病第一天只有一个患者,前5天为潜伏期,不发作也不会传染人,第6

6、天开始发作,从发作到治愈需要5天时间,期间每天传染3个人,求第N天共有多少患者。【选做题】(5选3) (1)为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!某批警察叔叔正在进行智力训练: 1 2 3 4 5 6 7 8 9 = 110; 请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。 请你利用计算机的优势,帮助警察叔叔快速找到所有答案。 每个答案

7、占一行。形如:12+34+56+7-8+9123+4+5+67-89(2)递归将一个整数输出。形如654321,输出1,2,3,4,5,6(3)用递归实现分解质因数。形如:12=2*2*3(4)50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?(5)电话号码对应的字符组合。题目:在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。四、实验过程以下程序都是在VS2010下编译与VC6.0代码稍有不同。(1)运

8、动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。题目分析依据题目可写出递归式:(F(n)-n)*6/7=F(n+1);F(n)是第n天奖牌总数即第n-1天剩余的包括第n天发的和剩下的。每天发放的金牌数:当天天数+(前一天剩余金牌-当天天数)/7,所以判别递归的条件是(前一天剩余金牌-当天天数)为7的整数倍,第i+1天的金牌数即i天剩下的必须是6的整数倍。算法构造递归函数:nSum(i+1,n)=(nSum(i,n)-i)*6

9、/7.筛选条件:(nSum(i,n)-i)%7=0&(nSum(i,n)%6=0)算法实现#include#define devide 7;/不知什么原因这样定义下面不能用?vc6.0未安上,不知与vs2010有和区别?int nSum(int i,int n)/nSum()函数定义第i天的金牌数即i-1天剩下. int result=0;if(i=n) return n;elseresult=(nSum(i+1,n)*7)/6+i);/递归函数:nSum(i+1,n)=(nSum(i,n)-i)*6/7.return result;void main()for(int n=2;n=10;n+

10、)/递增比赛天数逐个验证int skip=0;for(int i=1;i=n;i+)/依次筛选从i=1到n符合条件的n值if(nSum(i,n)-i)%7=0&(nSum(i,n)%6=0)/每天发放的金牌数:当天天数+(前一天剩余金牌-当天天数)/7,即(前一天剩余金牌-当天天数)为7的整数倍 int skip=1; /递归函数:nSum(i+1,n)=(nSum(i,n)-i)*6/7即nSum(i,n)=nSum(i+1,n)*7/6+i,第i+1天的金牌数即i天剩下的必须是6的整数倍 printf(共有金牌%d枚,共进行%d天n,nSum(1,n),n); /金牌总数即第一天金牌数 f

11、or(int j=1;j=n;j+) printf(第%d天,发放%d+%d枚,还剩%d枚n,j,j,(nSum(j,n)-j)/7,(nSum(j,n)-j)*6/7); break; if(skip=1)/用于跳出双层循环结构即n递增时第一个满足时即可输出,可运行结果却不然break;/会有在n上界内更多的结构输出,只有第一个n值满足不知为何?getchar();运行结果经验归纳递归式容易想出,但是相对的筛选条件比较难确定。(2)国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;给第i个儿

12、子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份?题目分析这道国王分财产的题和上题运动会发金牌类似,不过在筛选条件仅由题意略不同其实质也是一样,每个儿子分到的财产相同即:E(i+1,n)-E(i,n)=E(i,n)-E(i-1,n),且第i个儿子分i份及剩下的1/10,即E(i,n)-i的差是10的整数倍。算法构造递归函数:E(i+1,n)=(E(i,n)-n)*9/10;E(i,n)为当要分给第i个儿子时还有的份数;筛选条件:每个儿子分到的财产相同即E(i+1,n)-E(i,n)=E

13、(i,n)-E(i-1,n);且第i个儿子分i份及剩下的1/10,即E(i,n)-i的差是10的整数倍。算法实现#include#define devide 10;/这样定义到后面不知怎么却出错。int E(int i,int n)/递归函数:E(i+1,n)=(E(i,n)-n)*9/10;E(i,n)为当要分给第i个儿子时还有的份数;int sum=0;if(i=n)return n;/当份到最后一个儿子时分完,往前求解;elsesum=(E(i+1,n)*10)/9+i;/依次递归;return sum;void main()for(int n=3;n=10;n+)int skip=0;

14、for(int i=2;in;i+) /每个儿子分到的财产相同即E(i+1,n)-E(i,n)=E(i,n)-E(i-1,n);/且第i个儿子分i份及剩下的1/10,即E(i,n)-i的差是10的整数倍;if(2*E(i,n)-E(i-1,n)-E(i+1,n)=0)&(E(i,n)-i)%10=0)/用这两个条件筛选;int skip=1;printf(国王共有%d个儿子,财产共分成%d份。n,n,E(1,n);/总份数即要分第一个儿子时有的分数E(1,n)for(int j=1;j=n;j+)printf(第%d个儿子,分%d+%d份,还剩%d份。n,j,j,(E(j,n)-j)/10,(

15、E(j,n)-j)*9/10);break;if(skip=1)break;getchar();运行结果经验归纳由于和第一题类似,此题较为顺利,类似多练习也会得心应手。(3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。问这鱼缸里原有多少条金鱼?题目分析与上题类似出口为第四次买之前还有减去第四次买的还有11条。算法实现#include#define n 4;int Fish(int

16、i)/构造函数Fish(i)为第i天卖之前还剩多少,Fish(1)即为总鱼数;int result=0;if(i4)result=(Fish(i+1)+(Fish(i+1)+1)/i);elsereturn 14;/第四天卖之前的-第四天卖的=11,即Fish(4)-(Fish(4)/5+1/5)=11,F(4)=11return result;void main()printf(共有金鱼%d条。n,Fish(1);for(int i=1;i=4;i+)printf(第%d天,卖%d条,还剩%d条。n,i,(Fish(i)+i)/(i+1),(Fish(i)-(Fish(i)+i)/(i+1)

17、;getchar();运行结果经验归纳:以上题目类似可类比做出。4.某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?题目分析此题与以上几题类似,略有不同而已。算法构造由于从第一站出发没有任何变动,故将第二站作为始发站;函数Bus(i)为到达第i站还未上下乘客时车上人员数量;算法实现#includeint Bus(int i)/由于从第一站出发没有任何变动,故将第二站作为始发站; /

18、函数Bus(i)为到达第i站还未上下乘客时车上人员数量;int sum=0;if(i6)/sum=2*(Bus(i+1)+i-7);/有递归函数:Bus(i+1)=Bus(i)/2+7-i;elsereturn 10;/由最后还剩6人推的Bus(6)=10;return sum;void main()printf(发车时车上共有%d人。n,Bus(1);for(int i=1;i6;i+)printf(第%d站,上来%d人,下去%d人,剩下%d人n,i+1,(7-i),(Bus(i)/2),Bus(i+1);getchar();运行结果(5)猴子吃桃。有一群猴子摘来了一批桃子,猴王规定每天只准

19、吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?题目分析与上题类似算法构造递推函数Monkey(i)表示第i天吃的和剩下的和;由Monkey(i+1)=Monkey(i)/2-1推得;由Monkey(9)=Monkey(9)/2+1,得出口Monkey(9)=2。算法实现#includeint Monkey(int i)/递推函数Monkey(i)表示第i天吃的和剩下的和;int sum=0;if(i9)sum=2*(Monkey(i+1)+1);/由Monkey(i+1)=Monkey(i)/2-1推得;elsereturn 2;/由Monkey

20、(9)=Monkey(9)/2+1,得出口Monkey(9)=2;return sum;void main()printf(共有桃子%d个。n,Monkey(1);for(int i=1;i=9;i+)printf(第%d天,吃%d+%d个,剩下%d个。n,i,Monkey(i)/2,1,Monkey(i)/2-1);getchar();运行结果(6)小华读书。第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此,第六天读完了最后的三页,问全书有多少页?题目分析与以上题目类似。算法构造构造递推函数:Book(i);表示第i天要读时还剩的页数;由Book(i+1)=Book(i)

21、-(Book(i)/2+2)得出;由Book(5)-(Book(5)+2)=3可得出口;算法实现#includeint Book(int i)/构造递推函数:Book(i);表示第i天要读时还剩的页数;int sum=0;if(i5)sum=2*(Book(i+1)+2);/由Book(i+1)=Book(i)-(Book(i)/2+2)得出;elsereturn 10;/由Book(5)-(Book(5)+2)=3可得出口;return sum;void main()printf(全书共%d页。n,Book(1);for(int i=1;i=5;i+)printf(第%d天,看%d+%d页,

22、还剩%d页。n,i,Book(i)/2,2,Book(i)/2-2);getchar();运行结果(7)日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?题目分析由老大开始分给老二,当老大拿到老六的后总数达到平均数,以此为入口进行递推。算法构造第一个孩

23、子从国王那里分到的桔子总数应为平均数减去最后一个孩子分出去的部分后乘以8/7。算法实现#include #define DENOMINATOR_MAX 8 /分母最大值#define DENOMINATOR_MIN 3 /分母最小值/ai0表示第i个孩子分出的桔子总数/ai1表示第i个孩子从国王那里分到的桔子总数 int Orange(int a52,int i) int average=2520/6; int p; if (i=0) /第一个孩子从国王那里分到的桔子总数应为平均数减去最后一个孩子分出去的部分后乘以8/7。 ai1 = (average-average/(DENOMINATOR

24、_MIN-1)*(DENOMINATOR_MAX-i)/(DENOMINATOR_MAX-1-i); /第一个孩子分给第二个孩子的桔子数量。 ai0 = ai1 - (average-average/(DENOMINATOR_MIN-1); else /第i个孩子从国王那里分到的桔子总数。 ai1 = average *(DENOMINATOR_MAX-i)/(DENOMINATOR_MAX-1-i) - Orange(a,i-1); /第i个孩子分给第i+1个孩子的桔子数量。 ai0 = ai1 + Orange(a,i-1) - average; p=ai0; return p; /主函数

25、 void main() int ora52=0,0,0,0,0,0,0,0,0,0; Orange(ora,5); for(int j=0;j=5;j+) printf(第%d个孩子分出%d个橘子。n,j+1,oraj0); printf(国王最初分配桔子状况如下所示:n); for(int k=0;k=5;k+) printf(第%d个孩子从国王那里分得%d个橘子。n,k+1,orak1); getchar(); 运行结果(8)某种传染病第一天只有一个患者,前5天为潜伏期,不发作也不会传染人,第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人,求第N天共有多少患者。题目分析第n天

26、的病总人数包括n-1天潜伏的和发作的在当天又传染的人数再去掉当天治愈的;算法构造递推函数:该病五天内潜伏第六天发病后五天内治愈。Day(n)=Day(n-5)*3+Day(n-1);算法实现#include#includeint Day(int n)/递推函数:该病五天内潜伏第六天发病后五天内治愈。int sum=0;if(n=5)/五天内只有一个潜伏病人。return 1;elsesum=Day(n-5)*3+Day(n-1);/第n天的病总人数包括n-1天潜伏的和发作的在当天又传染的人数再去掉当天治愈的; /Day(n)=Day(n-5)*3+Day(n-1);return sum;voi

27、d main()int nprintf(请输入传染病发生后的天数:n);scanf_s(%d,&n,2);for(int i=1;i=n;i+)printf(第%d天,得病的人数%dn,i,Day(i);system(pause);运行结果选做题:(5选3)(4)50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?题目分析这道题让我想到高中时做过的同样的一道排列组合题,但此题要用计算机编程求出具体数字,不像高中时只用代数式表达。算法构造假设为20阶:C(0 20)+ C(1 19)+ C(2 18)+ C(3 17)+ C(4 16)+ C(5 15)+ C(6 14)+ C(7 13

28、)+ C(8 12)+ C(9 11)+ C(10 10)算法实现#include#includeint stairs(int n)if(n=1)return 1;if(n=0)return 1;return stairs(n-1)+stairs(n-2);/根据有1阶依次往上递推发现符合斐波那契数列 /an=an-1+an-2void main()int j;printf(请输入楼梯阶数:n);scanf_s(%d,&j,2);for(int i=1;i=j;i+)printf(当有%d阶楼梯,共有%d种走法。n,i,stairs(i);system(pause);运行结果数据可能过大或者电

29、脑太low等了几分钟未见结果,根据后几阶时可判断是对的。经验归纳有些题看似困难当理清思路也可有据可循。(2)递归将一个整数输出。形如654321,输出1,2,3,4,5,6题目分析将一个整数逆序输出可以看做把一个字符串逆序输出,用指针逐个输出。算法构造reverse(const char *p)字符串递推函数:设定字符串指针*p;算法实现程序源代码#includevoid reverse(const char *p)/字符串递推函数:设定字符串指针*p;if(*p=0)/指针从右向左移动由于判断字符串尾部位置;return;reverse(p+1);/指针向前移动p+1printf(%c,,*

30、p);/输出当前指针指向的字符;void main()char *pString;pString=123456;printf(输入的字符串:%sn,pString);reverse(pString);getchar();运行结果经验归纳巧用字符串指针可以简化程序。(3)用递归实现分解质因数。形如:12=2*2*3题目分析质因数n即只能被本身和1整除的数,在2到n-1间筛选能被n整除且是质因数的数即可分解。算法构造bool IsPrime(int num)/判断质因数;if(IsPrime(i)&( num % i = 0 )/判断除数是否为质因数;num = num / i;PrimeFact

31、orization(num);若是其一则保留对剩下的商继续判别;算法实现#include #include/质因数判断函数bool IsPrime(int num)/判断质因数; int i; for (i = 2; i num; i+) if ( num % i = 0 )/如果从2到num-1的数里有能被整除的,说明num不是质因数。return false; /如果从2到num-1的数里没有能被整除的,说明num是质因数。 return true; void PrimeFactorization(int num) int i;for (i=2; i=num; i+) if(i = num

32、)printf(%d,i); else if(IsPrime(i)&( num % i = 0 )/质因数判断函数;/将找到的质因数追加到字符串中。printf(%d*,i);/将剩下部分递归分解。num = num / i;PrimeFactorization(num);break; void main() int num;printf(请输入一个小于10位的整数:n); scanf_s(%d,&num,10);printf(质因数分解:n%d=,num);/调用分解质因数函数。 PrimeFactorization(num);printf(n);system(pause);运行结果经验归纳弄清题目关键字的概念对编程很是关键。五、实验总结 编程蛮有意思,在这里能够格物致知看到不一样的世界。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!