本帖最后由 张_涛 于 2012-7-21 07:25 编辑
- /**
- * 题目:一球从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[i];
-
- rebound(reboundArr, height, i, count);
- float sum = countSum(reboundArr) + height - reboundArr[reboundArr.length - 1];
-
- 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; i++) {
- sum += 2 * reboundArr[i];
- System.out.println(reboundArr[i]);
- }
- return sum;
- }
- }
- /*
- 算法思路:
- 1. 根据每次落下反弹,因为其都是反弹落下距离的一半,因此多次反弹具有相同的原理,由此想到使用递归算法。
- 在递归时,通过判断总弹起次数与当前弹起次数控制递归结束。
- 2. 使用rebound方法记录每次反弹的高度,即为落下高度的一半,存放到数组当中。
- 3. 而第10次落地时的距离包括第一次落下的距离,不包括第10次弹起的距离。而每次弹起,下次落下的距离是相等的,因此将其乘以2加入总距离当中。
- 4. 综上,即可得出所求。
- */
- 运行结果:
- 第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次弹起的高度为:0.09765625
- 第10次(最后一次)落地时经过的总距离为:299.70703
- 第10次(最后一次)反弹的高度为:0.09765625
复制代码 |