黑马程序员技术交流社区

标题: 运用递归算小球落下10次的总路程和第十次的反弹高度 [打印本页]

作者: 想要那片海    时间: 2015-5-25 19:56
标题: 运用递归算小球落下10次的总路程和第十次的反弹高度
本帖最后由 想要那片海 于 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. }
复制代码

作者: 仅此一抹心醉    时间: 2015-5-25 21:37
  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);
复制代码
我看着觉得听复杂的。
作者: 想要那片海    时间: 2015-5-25 21:54
仅此一抹心醉 发表于 2015-5-25 21:37
我看着觉得听复杂的。

你的结果不对呀,如果只计算落地1次,那就是高度100,可是你的代码运行结果是200,而且,第一次反弹起来应该是50米,你的结果是25米,总路程加多了,反弹高度除多了
作者: 仅此一抹心醉    时间: 2015-5-26 22:47
想要那片海 发表于 2015-5-25 21:54
你的结果不对呀,如果只计算落地1次,那就是高度100,可是你的代码运行结果是200,而且,第一次反弹起来 ...

修改一下初试条件就好了  我写错了  不好意思啊
作者: mnxnm    时间: 2015-5-29 12:39
本帖最后由 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. }
复制代码

作者: mnxnm    时间: 2015-5-29 12:47
经过验证,这么做可以,算到上千次后,总路程已经不变啦,哈哈,无限接近200米,哈哈
作者: 想要那片海    时间: 2015-5-29 13:09
mnxnm 发表于 2015-5-29 12:47
经过验证,这么做可以,算到上千次后,总路程已经不变啦,哈哈,无限接近200米,哈哈 ...

从100米落下,还能反弹上千次?也要考虑实际情况的呀,可以提升降落高度再运算增加反弹次数后的反弹的路程
作者: mnxnm    时间: 2015-5-29 13:40
这道题本身就没有考虑实际情况啊,
摩擦阻力没有给,万有引力系数没有
:lol
按照题意"每次落地后反跳回原高度的一半",
只有反弹后的高度为零时,即落地后不反弹,才算结束
作者: 微凉的暮色    时间: 2015-5-29 14:06
:lol
干嘛不加个条件。高度多少时默认为停止弹跳
作者: 夏尔    时间: 2015-5-29 14:16
赞一个,黑马人才济济啊
作者: ln0491    时间: 2015-9-6 11:03
牛。。。。。。。。。
作者: 曾宇    时间: 2015-9-6 11:13
2^10 = 1024
100/1024<0.1
经过10次

100+100-1000/1024 = 199.0234375
经过路程199.0234375米




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2