张_涛 发表于 2012-7-21 07:22
/**
* 题目:一球从100米高度自由落下,每次落地后反弹回原高度的一半;再落下,求它在第10次 落地时,共经过多少米?第10次反弹多高?
*/
public class ReboundTest {
public static void main(String[] args) {
// 定义初次落下的高度
float height = 100;
// 定义变量i记录一共反弹的次数
int i = 10;
// 定义变量count记录正在反弹的次数
int count = 1;
// 定义一个float数组记录每次反弹的高度(同时也是下次落下的高度)
float[] reboundArr = new float;
rebound(reboundArr, height, i, count);
float sum = countSum(reboundArr) + height;;
System.out.println("第10次(最后一次)落地时经过的总距离为:" + sum);
System.out.println("第10次(最后一次)反弹的高度为:" + reboundArr[reboundArr.length - 1]);
}
//将每次反弹的高度记录到arr数组当中
public static void rebound(float[] arr, float height, int i, int count) {
arr[count - 1] = height / 2;
count++;
if (count <= i) {
rebound(arr, arr[count - 2], i, count);
}
}
//统计反弹的总高度
public static float countSum(float[] reboundArr) {
float sum = 0;
for (int i = 0; i < reboundArr.length - 1; i++) {
sum += 2 * reboundArr;
System.out.println("第" + (i + 1) + "次弹起的高度为:" + reboundArr);
}
return sum;
}
}
/*
算法思路:
1. 根据每次落下反弹,因为其都是反弹落下距离的一半,因此多次反弹具有相同的原理,由此想到使用递归算法。
在递归时,通过判断总弹起次数与当前弹起次数控制递归结束。
2. 使用rebound方法记录每次反弹的高度,即为落下高度的一半,存放到数组当中。
3. 而第10次落地时的距离包括第一次落下的距离,不包括第10次弹起的距离。而每次弹起,下次落下的距离是相等的,因此将其乘以2加入总距离当中。
4. 综上,即可得出所求。
*/
第一次算成第11次落地经过的距离了。
改过来了,运行结果:
第1次弹起的高度为:50.0
第2次弹起的高度为:25.0
第3次弹起的高度为:12.5
第4次弹起的高度为:6.25
第5次弹起的高度为:3.125
第6次弹起的高度为:1.5625
第7次弹起的高度为:0.78125
第8次弹起的高度为:0.390625
第9次弹起的高度为:0.1953125
第10次(最后一次)落地时经过的总距离为:299.60938
第10次(最后一次)反弹的高度为:0.09765625 |