实验报告电子版Word文件下载.docx
《实验报告电子版Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验报告电子版Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
(1)电子版提交说明:
a需要提交Winrar压缩包,文件名为“《算法设计与分析》实验一_学号_姓名”,
如“《算法设计与分析》实验一_09290101_张三”。
b压缩包内为一个“《算法设计与分析》实验一_学号_姓名”命名的顶层文件夹,
其下为两个文件夹,一个文件夹命名为“源程序”,另一个文件夹命名为“实验
报告电子版”。
其下分别放置对应实验成果物。
(2)打印版提交说明:
a不可随意更改模板样式。
b字体:
中文为宋体,大小为10号字,英文为TimeNewRoman,大小为10号
字。
c行间距:
单倍行距。
(3)提交截止时间:
2012年10月31日16:
00。
三、实验项目
1.运用递归策略设计算法实现下述题目的求解过程。
题目列表如下:
(1)运动会开了N天,一共发出金牌M枚。
第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。
到了第N天刚好还有金牌N枚,到此金牌全部发完。
编程求N和M。
(2)国王分财产。
某国王临终前给儿子们分财产。
他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;
给第二个儿子两份,再加上剩余财产的1/10;
……;
给第i个儿子i份,再加上剩余财产的1/10。
每个儿子都窃窃自喜。
以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。
请用程序回答,老国王共有几个儿子?
财产共分成了多少份?
(3)出售金鱼问题:
第一次卖出全部金鱼的一半加二分之一条金鱼;
第二次卖出乘余金鱼的三分之一加三分之一条金鱼;
第三次卖出剩余金鱼的四分之一加四分之一条金鱼;
第四次卖出剩余金鱼的五分之一加五分之一条金鱼;
现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。
问这鱼缸里原有多少条金鱼?
(4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;
到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?
(5)猴子吃桃。
有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?
(6)小华读书。
第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少钱页?
(7)日本著名数学游戏专家中村义作教授提出这样一个问题:
父亲将2520个桔子分给六个儿子。
分完后父亲说:
“老大将分给你的桔子的1/8给老二;
老二拿到后连同原先的桔子分1/7给老三;
老三拿到后连同原先的桔子分1/6给老四;
老四拿到后连同原先的桔子分1/5给老五;
老五拿到后连同原先的桔子分1/4给老六;
老六拿到后连同原先的桔子分1/3给老大”。
结果大家手中的桔子正好一样多。
问六兄弟原来手中各有多少桔子?
四、实验过程
(一)题目一:
……
1.题目分析
由题可知,最后一天发的金牌数一定是6的整数倍枚,所有由此可以建立递推关系式。
2.算法构造
gold=(melodyfun(i+1,n)*7/6+i);
3.算法实现
#include<
iostream>
cmath>
usingnamespacestd;
intmelodyfun(inti,intn)//递推函数
{
intgold=0;
if(i==n)
{
gold=6;
}
else
gold=(melodyfun(i+1,n)*7/6+i);
returngold;
}
voidmain()
intn=6;
intm;
for(inti=1;
i<
=n;
i++)
if(melodyfun(i,n)%6==0)
{
if(n==i)break;
n=n+6;
cout<
<
"
运动会连续召开"
<
n<
天"
endl;
共有金牌"
melodyfun(1,n)<
块。
"
endl;
4.运行结果
5.经验归纳
只要能顺利的找到递推关系式,问题就很好解决了。
题目
(二)
由题可知,最后一个儿子分的财产一定是9的整数倍
money[i]=money[i+1]*10/9+i;
intmain()
intn=9;
intmoney[1000];
for(inti=n;
i>
=1;
i--)
money[n+1]=0;
money[i]=money[i+1]*10/9+i;
for(intj=1;
j<
j++)
if(money[j]%9==0)
if(n==j)break;
n=n+9;
}
总共分了"
money[1]<
份"
共有"
个儿子"
找递推关系
题目(三)
从剩余的条数往上推即可;
num[day-i]=((num[day-i+1]+1)*(day-i+1))/(day-i)-1;
intmain()
intnum[100];
intleave;
剩余的金鱼数"
cin>
>
leave;
intday;
卖的天数"
day;
num[day]=leave;
for(inti=1;
i<
i++)
num[day-i]=((num[day-i+1]+1)*(day-i+1))/(day-i)-1;
金鱼数为:
num[1]<
return0;
找到递推关系即可
题目(四)
num[station-i]=(num[station-i+1]-i)*2;
intstation;
请输入车站数"
station;
intlastnum;
请输入最后一站剩余的人数"
lastnum;
num[station]=lastnum;
=station;
num[station-i]=(num[station-i+1]-i)*2;
始发时车上的人数为:
num[2]<
找到递推关系式即可;
题目(五)
num[day-i]=(num[day-i+1]+1)*2;
请输入剩余的桃子数"
请输入吃的天数"
=day;
num[day-i]=(num[day-i+1]+1)*2;
桃子总数为:
num[0]<
题目(六)
page[day-i]=(page[day-i+1]+2)*2;
intpage[100];
请输入剩余的页数"
请输入阅读的天数"
page[day]=leave;
page[day-i]=(page[day-i+1]+2)*2;
全书一共有"
page[0]<
页"
题目(七)
3.if(i==0)
a[0][1]=(average-average/(3-1))*8/7;
a[0][0]=a[0][1]*1/8;
a[i][1]=average*(8-i)/(8-1-i)-a[i-1][0];
a[i][0]=average*1/(8-1-i);
4.算法实现
inta[100][100];
intorange;
请输入桔子总数:
orange;
intchildren;
请输入孩子数"
children;
for(inti=0;
intaverage=orange/children;
if(i==0)
for(intj=0;
j++)
第"
j+1<
个孩子分到的桃子为:
a[j][1]<
5.运行结果
6.经验归纳
五、实验总结
做递归类问题,一定要根据题目给的信息分析出递推关系式,然后求解