A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 想要那片海 于 2015-5-25 19:57 编辑
  1. 除了循环和递归,还有别的更优化的方法吗?
复制代码
  1. <span style="line-height: 2.2em;">/*编程一个球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在</span>第10次落地时,共经过多少米?第10次反弹多高?*/
  2. public class GetHigh {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 System.out.println("10次反弹的总路程:"+getTotal(100,10)+"米");
  6.                 System.out.println("第十次反弹:"+getHigh(100,4)+"米");
  7.         }
  8.         public static double getTotal(double h,double time)
  9.         {
  10.                 double sum=0;
  11.                 if(time==1)
  12.                         sum=h;//如果小球只降落1次,那么一共就经过100米               
  13.                 else//否则使用递归进行计算总经过的路程
  14.                         //每次走过的总路程还包括前一次落下的高度和本次反弹上升的高度(上升的是落下的一半)
  15.                         sum=h+h/2+getTotal(h/2,time-1);       
  16.                 return sum;
  17.         }
  18.         public static double getHigh(double h,double time)
  19.         {
  20.                 double high=0;       
  21.                 if(time==1)
  22.                         high=h/2;//反弹一次是高度的一半
  23.                 else//如果不是反弹一次,则运用递归算法
  24.                   high=getHigh(h/2,time-1);
  25.                 return high;
  26.         }
  27. }
复制代码

11 个回复

正序浏览
2^10 = 1024
100/1024<0.1
经过10次

100+100-1000/1024 = 199.0234375
经过路程199.0234375米
回复 使用道具 举报
牛。。。。。。。。。
回复 使用道具 举报
赞一个,黑马人才济济啊
回复 使用道具 举报
:lol
干嘛不加个条件。高度多少时默认为停止弹跳
回复 使用道具 举报
mnxnm 中级黑马 2015-5-29 13:40:57
8#
这道题本身就没有考虑实际情况啊,
摩擦阻力没有给,万有引力系数没有
:lol
按照题意"每次落地后反跳回原高度的一半",
只有反弹后的高度为零时,即落地后不反弹,才算结束
回复 使用道具 举报
mnxnm 发表于 2015-5-29 12:47
经过验证,这么做可以,算到上千次后,总路程已经不变啦,哈哈,无限接近200米,哈哈 ...

从100米落下,还能反弹上千次?也要考虑实际情况的呀,可以提升降落高度再运算增加反弹次数后的反弹的路程
回复 使用道具 举报
经过验证,这么做可以,算到上千次后,总路程已经不变啦,哈哈,无限接近200米,哈哈
回复 使用道具 举报
本帖最后由 mnxnm 于 2015-5-29 12:40 编辑
  1. package getGoal;
  2. /**
  3. * 一个球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下;
  4. * 求它在第10次落地时,共经过多少米?第10次反弹多高?
  5. *
  6. * @author sman@mnxnm.com
  7. *
  8. */
  9. public class 计算小球高度 {
  10.         public static void main(String[] args) {
  11.                  double h = 100, s =0 ;
  12.             for (int i = 1; h > 0; i++) {
  13.                  s += h;
  14.                  h /= 2;
  15.                if (i==10){
  16.                           System.out.println("第"+ i +"次落地时经过的总路程:" + s+"米");
  17.                           System.out.println("第"+ i +"次反弹后的高度:" + h +"米\n");
  18.                }
  19.             }
  20.         }
  21. }
复制代码
回复 使用道具 举报
想要那片海 发表于 2015-5-25 21:54
你的结果不对呀,如果只计算落地1次,那就是高度100,可是你的代码运行结果是200,而且,第一次反弹起来 ...

修改一下初试条件就好了  我写错了  不好意思啊
回复 使用道具 举报
仅此一抹心醉 发表于 2015-5-25 21:37
我看着觉得听复杂的。

你的结果不对呀,如果只计算落地1次,那就是高度100,可是你的代码运行结果是200,而且,第一次反弹起来应该是50米,你的结果是25米,总路程加多了,反弹高度除多了
回复 使用道具 举报
  1. double h = 100, s = 100;
  2.                 for (int i = 0; i < 10; i++) {
  3.                         s += h;
  4.                         h /= 2;
  5.                 }
  6.                 System.out.println("经过的路程:" + s);
  7.                 System.out.println("反弹的高度:" + h / 2);
复制代码
我看着觉得听复杂的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马