隔壁泰山


私信TA

用户名:1806342813

访问量:2681

签 名:

不疯魔,不成活

等  级
排  名 16326
经  验 808
参赛次数 0
文章发表 5
年  龄 0
在职情况 学生
学  校 湖北文理学院
专  业

  自我简介:

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

  评论区

  • «
  • »