资源描述:
《递归算法-解答》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、/*---------------------------------------------------------------------------------------------------------------------------1、运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。------------------------------------------------
2、---------------------------------------------------------------------------*//**/#includeintF(intn,int&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);}//当
3、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=%dM=%d",N,M);/*//验证printf("分析:");for(i=1;i<=N;i++){printf("N=%d时,M=%d",i,M);M=(M-i)/7*6;}*/}/*-
4、--------------------------------------------------------------------------------------------------------------------------2、国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少
5、份?---------------------------------------------------------------------------------------------------------------------------*//**/#includeintF(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的
6、整数倍时,进行下一步判断if(m==0)return1;//当财产剩余数为零时,返回1,结束main函数中的i循环else{m=m/10*9;F(n,m);}//当财产剩余数不为零时,调用F}elsereturn0;//当不是10的整数倍时,返回0,继续i循环}voidmain(){intn,m;for(inti=1;i;i++)//当i==1时,存在一组取值{n=0;//对于每一个i,需对n清零m=i;//以i循环来产生财产份数if(F(n,m))break;//返回1,结束循环}printf("n=%dm=%d或",n,m);for(i=2;i;i++)
7、//当i>=2时,存在一组取值{n=0;//对于每一个i,需对n清零m=i;//以i循环来产生财产份数if(F(n,m))break;//返回1,结束循环}printf("n=%dm=%d",n,m);/*//验证printf("分析:");for(i=1;i<=n;i++){printf("n=%d时,财产剩余m=%d",i,m);m=(m-i)*9/10;}*/}/*-----------------------------------------------------------------------------------------