解题思路:这个题,倔强的我非要用递归,花了我很长时间才把正确代码码起来(我是个菜鸡,功底不好,其实我要是用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 人评分