編程題目:
63.一球從100米高度自由落下,每次落地後反跳回原高度的一半再落下,求它在第10次落地時,共經過多少米?第10次反彈多高?
示例代碼:
package program.calculation.exercise63;
/**
* 63.一球從100米高度自由落下,每次落地後反跳回原高度的一半再落下,
* 求它在第10次落地時,共經過多少米?第10次反彈多高?
* 299.609375
* 0.09765625
*/
public class BallHeight {
public static void main(String[] args) {
int n = 10; //落地次數n
double sHeight = 100; //開始時高度
System.out.println("第一種方式(循環):");
loopHeight(n,sHeight);
System.out.println("第二種方式(遞歸):");
recurHeight(n,sHeight);
}
//第一種方式:循環
private static void loopHeight(int n, double sHeight){
double length = sHeight; //第1次落地前小球經過的長度
//此循環計算第n次落地前小球經過的長度,所以不能加上第n次小球彈起的高度
for(int i=1;i<n;i++){ //此處i<n而不能i=n
sHeight /= 2; //每次落地後反跳回原高度的一半
length += sHeight*2; //每次小球彈起再落下,經過的長度應該是彈起高度的2倍
}
sHeight /= 2; //求出第n次落地時小球彈起的高度
System.out.println("在第10次落地時共經過"+length+"米");
System.out.println("第10次反彈"+sHeight+"米");
}
//第二種方式:遞歸
private static void recurHeight(int n, double sHeight) {
double length = sHeight; //第1次落地前小球經過的長度
//此循環計算第n次落地前小球經過的長度,所以不能加上第n次小球彈起的高度
for(int i=1;i<n;i++){ //此處i<n而不能i=n
double height = recurBallHeight(i,sHeight);
length += height*2; //每次小球彈起再落下,經過的長度應該是彈起高度的2倍
}
double eHeight = recurBallHeight(n,sHeight);//求出第n次落地時小球彈起的高度
System.out.println("在第10次落地時共經過"+length+"米");
System.out.println("第10次反彈"+eHeight+"米");
}
//遞歸求出第n次落地時小球彈起的高度
private static double recurBallHeight(int n,double sHeight) {
if(n == 1){
return sHeight/2; //每次落地後反跳回原高度的一半
}else{
return recurBallHeight(n-1,sHeight)/2;
}
}
}