《算法设计与分析》递归算法典型例题Word文档格式.doc
- 文档编号:14563535
- 上传时间:2022-10-23
- 格式:DOC
- 页数:7
- 大小:302KB
《算法设计与分析》递归算法典型例题Word文档格式.doc
《《算法设计与分析》递归算法典型例题Word文档格式.doc》由会员分享,可在线阅读,更多相关《《算法设计与分析》递归算法典型例题Word文档格式.doc(7页珍藏版)》请在冰豆网上搜索。
源程序:
(3)出售金鱼问题:
第一次卖出全部金鱼的一半加二分之一条金鱼;
第二次卖出乘余金鱼的三分之一加三分之一条金鱼;
第三次卖出剩余金鱼的四分之一加四分之一条金鱼;
第四次卖出剩余金鱼的五分之一加五分之一条金鱼;
现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。
问这鱼缸里原有多少条金鱼?
(4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;
到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?
(5)猴子吃桃。
有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?
(6)小华读书。
第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少页?
(7)日本著名数学游戏专家中村义作教授提出这样一个问题:
父亲将2520个桔子分给六个儿子。
分完后父亲说:
“老大将分给你的桔子的1/8给老二;
老二拿到后连同原先的桔子分1/7给老三;
老三拿到后连同原先的桔子分1/6给老四;
老四拿到后连同原先的桔子分1/5给老五;
老五拿到后连同原先的桔子分1/4给老六;
老六拿到后连同原先的桔子分1/3给老大”。
结果大家手中的桔子正好一样多。
问六兄弟原来手中各有多少桔子?
四、实验过程
(一)题目一:
……
1.题目分析
由已知可得,运动会最后一天剩余的金牌数gold等于运动会举行的天数由此可倒推每一天的金牌剩余数,且每天的金牌数应为6的倍数。
2.算法构造
设运动会举行了N天,
If(i==N)Gold[i]=N;
Elsegold[i]=gold[i+1]*7/6+i;
3.算法实现
#include<
iostream>
//预编译命令
usingnamespacestd;
voidmain() //主函数
{
inti=0,count=0;
//count表示运动会举办的天数
intgold[100];
//定义储存数组
do
{
count=count+6;
//运动会天数加六
gold[count]=count;
for(i=count-1;
i>
=1;
i--)
{
if(gold[i+1]%6!
=0)
break;
//跳出for循环
else
gold[i]=gold[i+1]*7/6+i;
//计算第i天剩余的金牌数
}
}while(i>
=1);
//当i>
=1继续做do循环
cout<
<
"
运动会开了"
count<
天"
endl;
//返回天数
cout<
总共发了"
gold[1]<
枚金牌"
endl;
//返回金牌数
}
4.运行结果
(二)题目二:
由已知可得,最后一个儿子得到的遗产份数即为王子数目,由此可得到每个儿子得到的遗产份数,在对遗产数目进行合理性判断可得到符合要求的结果。
设皇帝有count个王子,
property[count]=count;
for(i=count-1;
if(property[i+1]%9!
break;
//数目不符跳出for循环
else
property[i]=property[i+1]*10/9+i;
//计算到第i个王子时剩余份数
}
#include<
usingnamespacestd;
voidmain() //主函数
{
inti=0,count=0;
//count表示国王的儿子数
intproperty[100];
//定义储存数组,表示分配到每个王子时剩余份数
do
{
count=count+9;
//王子数目为9的倍数
property[count]=count;
for(i=count-1;
if(property[i+1]%9!
}
}while(i>
皇帝有"
个儿子"
//返回王子数
遗产被分成"
property[1]<
份"
//返回遗产份数
}
(三)题目三:
由最后一天的金鱼数目,可递推得到每天的金鱼数目,第一天的数目即为金鱼总数。
fish[5]=11;
for(i=4;
fish[i]=(fish[i+1]*(i+1)+1)/i;
//计算到第i天剩余金鱼条数
#include<
usingnamespacestd;
voidmain() //主函数
{
inti=0;
intfish[6];
//定义储存数组各天剩余金鱼数
fish[5]=11;
cout<
浴缸里原有金鱼"
fish[1]<
条"
//返总金鱼数
}
(四)题目四:
有到终点站时车上的乘客数可求得到任意一站的乘客人数,到第二站时车上的乘客数目即为发车时车上的乘客数。
num[8]=6;
//到终点站车上还有六人
for(i=7;
=2;
num[i]=2*(num[i+1]-8+i);
//计算到第i站车上的人数
inti=0;
intnum[9];
发车时车上有"
num[2]<
位乘客"
//返总发站人数,即为到第二站时车上人数
(五)题目五:
可假设有第十天,则第十天剩余的桃子数目为0,由此递推可得每一天剩余的桃子数目。
第一天的桃子数目即为猴子摘桃子的总数。
num[10]=0;
//第n天吃前的桃子数
for(i=9;
num[i]=2*(num[i+1]+1);
//计算到第i天剩余的桃子数算法实现
intnum[11];
num[i]=2*(num[i+1]+1);
//计算到第i天剩余的桃子数
猴子共摘来了"
num[1]<
个桃子"
//输出总的桃子数,即第一天吃前的数目
(六)题目六:
由第六天剩余的页数可递推得到每天的剩余页数,第一天的页数即为全书的页数
num[6]=3;
//到第n天时剩余的页数
for(i=5;
num[i]=2*(num[i+1]+2);
//计算到第i天剩余的页数
#include<
inti=0;
intnum[7];
num[6]=3;
全书共有"
页"
//输出总页数,即第一天吃前的数目
(七)题目七:
由已知可得,第一个儿子得到的橘子数目为平均数的一半,由此可得到第一个儿子原先的橘子数目,而第i个儿子原先的橘
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法设计与分析 算法 设计 分析 递归 典型 例题