text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
/*
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,
求它在第10次落地时,共经过多少米?第10次反弹多高
这里用BigDecimal避免精度丢失
*/
public class FreeFallingBody {

   public void tradition(){
      //传统算法 循环10次计算这里用BigDecimal避免精度丢失
      BigDecimal distance = new BigDecimal(100.0);
      BigDecimal height = new BigDecimal(100.0);
      BigDecimal result = null;
      BigDecimal percentage = new BigDecimal(2.0);
      for (int i = 0; i <10 ; i++) {
         height = height.divide(percentage);
         if (result == null) result = distance.add(height);
         else result = result.add(height);
         //System.out.println("distance" + result);
      }
      System.out.println( result);
   }

   /**
    * 这里用BigDecimal避免精度丢失
    * 以1为次数起点正向递归求第n次后自由落体后小球运动了多少距离
    * 自定义求第n次后自由落体后小球运动了多少距离
    * 以及逆向求第k次前的第n次之间自由落体后小球运动了多少距离
    * 递归逆向求运动距离时候distance第一次运动距离为 0
    * */
   public BigDecimal diyFreeFallingBody(int fallingTimes,int thisTimes,BigDecimal height,BigDecimal percentageHeight,BigDecimal distance  ){
      /**所求落体次数相同则直接返回高度*/
      if (thisTimes == fallingTimes) return distance.add(height.divide(percentageHeight));
      else if (thisTimes < fallingTimes){
         /**反复正向递归求下一次自由落体高度*/
         if (thisTimes == 1) distance = height;
         BigDecimal nextHeight = height.divide(percentageHeight);
         return diyFreeFallingBody(fallingTimes,thisTimes+1,nextHeight,percentageHeight,distance.add(nextHeight));
      }else if (thisTimes>fallingTimes+1){
         /**反复逆向递归求下一次自由落体高度*/
         BigDecimal lastHeight = height.multiply(percentageHeight);
         if (distance.intValue()==0) distance = height;
         System.out.println("distance" + distance);
         return diyFreeFallingBody(fallingTimes,thisTimes-1,
               lastHeight,percentageHeight,distance.add(lastHeight));
      }else if (thisTimes ==fallingTimes+1){
         return distance.add(height.multiply(percentageHeight));
      }
      return new BigDecimal(0);
   }
}

原文地址:https://blog.csdn.net/qq_29856589/article/details/80085115?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168475001216800227455128%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168475001216800227455128&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-12-80085115-null-null.142^v87^insert_down1,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96