1.题目解析
球经过的路径:下落经过的距离+落地弹起的高度
推测,第三次落地,那么他经过的路径如下
第一次落地: 100
第一次弹起高度:100/2
第二次落地:50
第二次弹起:50/2
第三次落地:25
第三次弹出 25/2
故此,第三次所经过的路径 = 100+100/2+50+50/2+25 = 250
x + x/2 +x/2 + x /2*2 + x /2*2...
2.代码实现
方式一:
/**
* <p>计算第count次小球所经过的路径以及弹起的高度</p>
*
* @param height 初始的高度
* @param count 弹起的次数
*/
public static void computed(float height, int count) {
// 边界判断
if (height <= 0 || count < 1) {
throw new RuntimeException("非法参数");
}
// 第一次落地高度
float length = height;
int i = 1;
// 参数校验
if (i == count) {
System.out.println(0);
}
while (i < count) {
length += 2 * height / (2 * i);
i++;
if (i==count) {
System.out.println("第"+i+"次小球弹起的高度height="+height/(Math.pow(2,i)));
}
}
System.out.println("第"+i+"次小球所经过的路径length =" + length);
}
方式二:
/**
* 求每次小球落地后反跳回原高度一半
* 解题步骤:
* step-1: 定义获取球经过的长度变量 length
* step-2: 计算球下落经过的长度 length = length + height
* step-3: 计算第i次下降后弹起返回的高度 height = height / 2;
*
* @param height 初始化高度
* @param count 弹跳次数
* @return
*/
private static void computed(float height, int count) {
// 参数校验
if (height <= 0 || count <1) {
throw new RuntimeException("参数非法!");
}
// 定义长度的辅助变量
float length = 0f;
// 小球的弹跳循环次数
for (int i = 1; i <= count; i++) {
// 加上第i次要下降的高度
length += height;
// 第i次下降后返回的高度
height = height / 2;
// 如果是第count(弹跳的次数)次,那么这次不加往上的高度
if (i == count) {
System.out.println("第"+i+"次小球反弹的高度=" + height);
} else {
//小球向上弹跳的高度
length += height;
}
}
System.out.println("第"+count+"次小球落地经过的路径=" + length);
}