递归算法解答Word文档下载推荐.doc
《递归算法解答Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《递归算法解答Word文档下载推荐.doc(6页珍藏版)》请在冰豆网上搜索。
m) //若n天时,有金牌m枚;
则前一天有金牌N*7/6+N-1枚,即n--天时,m=m/6*7+n.
{
if(m%6==0){ //因金牌的数量必须为整数,则m和m/6*7+n也为整数,则m必须为6的整数倍
if(n==1)return1;
//逆推至第一天时,返回1,结束main函数中的i循环
else{n--;
m=m/6*7+n;
F(n,m);
} //当n不是第一天,调用F,依次向前,并将金牌数存放至&
m中,即M中
}
elsereturn0;
//当m不是6的整数倍,返回0,不结束i循环
}
voidmain()
intN,M;
for(inti=1;
i;
i++)
{
M=i;
//因第N天刚好还有金牌N枚,可以将i赋给NM,判断是否可以推至第一天
N=i;
if(F(N,M))break;
//返回1,结束循环
printf("
N=%d M=%d\n"
N,M);
/*//验证
\n分析:
\n"
);
for(i=1;
i<
=N;
printf("
N=%d时,M=%d\n"
i,M);
M=(M-i)/7*6;
2、国王分财产。
某国王临终前给儿子们分财产。
他把
财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;
给第二个儿子两份,再加上剩余财产的1/10;
……;
给第i个儿子i份,
再加上剩余财产的1/10。
每个儿子都窃窃自喜。
以为得到了父王的偏
爱,孰不知国王是“一碗水端平”的。
请用程序回答,老国王共有几
个儿子?
财产共分成了多少份?
intF(int&
n,intm) //假设老国王共有n个儿子,财产共分成了m份,第一个儿子时,剩余财产份数(m-1)*9/10,
{//第n++个儿子时,剩余财产份数m=(m-n)*9/10;
m=(m-n)应为10的整数倍。
n++;
m=m-n;
if(m%10==0){ //为10的整数倍时,进行下一步判断
if(m==0)return1;
//当财产剩余数为零时,返回1,结束main函数中的i循环
else{m=m/10*9;
} //当财产剩余数不为零时,调用F
//当不是10的整数倍时,返回0,继续i循环
intn,m;
i++) //当i==1时,存在一组取值
n=0;
//对于每一个i,需对n清零
m=i;
//以i循环来产生财产份数
if(F(n,m))break;
n=%d m=%d或\n\n"
n,m);
for(i=2;
i++) //当i>
=2时,存在一组取值
n=%d m=%d\n"
=n;
n=%d时,财产剩余m=%d\n"
i,m);
m=(m-i)*9/10;
3、某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,
再上来了六位乘客;
到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车
上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发
车时车上的乘客有多少?
intF(intn)
if(n==8)return6;
elsereturn(F(n+1)+n-7)*2;
//对下一站有F(n+1)=F(n)/2+(7-n),则F(n)=……
第1站发车时车上有乘客%d人\n"
F
(1));
//验证 for(inti=2;
i<
=8;
i++)printf("
第%d站,有乘客%d人,在该站上车%d人\n"
i,F(i),8-i);
4、猴子吃桃。
有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),
第九天正好吃完,问猴子们摘来了多少桃子?
1022
if(n==10)return0;
elsereturn(F(n+1)+1)*2;
//对后一天有F(n+1)=F(n)/2-1,则F(n)=……
猴子们摘来桃子%d个\n"
//验证 for(inti=1;
=9;
第%d天有%d个桃子,吃%d个\n"
i,F(i),F(i)/2+1);
5、小华读书。
第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,
第六天读完了最后的三页,问全书有多少钱页?
220
if(n==6)return3;
elsereturn(F(n+1)+2)*2;
//对后一天有剩余页数F(n+1)=F(n)/2-2,则F(n)=……
全书有多少%d页\n"
第%d天有%d页,读%d页\n"
i,F(i),F(i)/2+2);
6、题目描述:
日本著名数学游戏专家中村义作教授提出这样一个问题:
父亲将2520个桔子分给六个儿子。
分完后父亲说:
“老大将分给你的桔子的1/8给老二;
老二拿到后连同
原先的桔子分1/7给老三;
老三拿到后连同原先的桔子分1/6给老四;
老四拿到后连同原先的桔子分1/5给
老五;
老五拿到后连同原先的桔子分1/4给老六;
老六拿到后连同原先的桔子分1/3给老大”。
结果大家手
中的桔子正好一样多。
问六兄弟原来手中各有多少桔子?
?
voidF(intA[],intn)
if(n<
6)F(A,n+1);
A[n]=A[n]/(8-n)*(9-n)-A[n-1]/(9-n);
//A[n]/(8-n)*(9-n)表示给出桔子前的桔子数目;
} //A[n]/(8-n)*(9-n)-A[n-1]/(9-n)表示得到桔子前的数目
intA[7]={0,420,420,420,4