解题思路:这个题,倔强的我非要用递归,花了我很长时间才把正确代码码起来(我是个菜鸡,功底不好,其实我要是用for循环会快一点,但是要锻炼自己多用递归,调用函数,等等一些稍微高级的方法),这个题用递归来做,计算出第N次落地后弹起的高度,在求第n次落地的时候经过的总高度,再次调用前面那个自定义函数,来求和,要特别注意的是,每落地之后的那次弹起与落下经过的路程是相同的故要乘以2,而第一次是直接从原始高度落下的,所以只用加一遍。
注意事项:注意传值时有浮点型的和整型两种不要混淆了,还有就是递归return返回时尽量不要写赋值式,并且只能返回一个值,递归的时候要把调用的函数形式写正确,有几个参都要带上,不能缺,而且递归的时候要知道那个参数是变参。
参考代码:
#include<stdio.h>
double f(double m,int n){//使用递归函数
if(n==0)
return m;
if(n==1)
return m/2;
if(n>1)
return f(m,n-1)/2; //这里用的递归,每次都是前一次的一半高度 返回的是f(m,n),而它正好等于f (m,n-1)/2;
else return 0;
}
int main()
{
double M,h,s=0; //M是原始高度,h第n次落地后弹起的高度,s是n次经过的总高度(注意不包括第n次落地后弹起的高度)
int N; //N为落地的次数
scanf("%lf ",&M);
scanf("%d",&N);
h=f(M,N); //调用f()函数计算第N次落地后弹起的高度
for(int i=N-1;i>=0;i--) / /用for循环把第N次之前的高度都加起来
{
s=s+2*f(M,i); //注意每次弹起和落地经过2次相同的高度故乘以2,第一次是直接落地没有弹起相同高度,故减去原始高度M
}
s=s-M;
printf("%.2lf %.2lf",h,s);
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复