63.求球體自由落體運動反彈總路程與反彈高度

編程題目:

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;
		}
		
	}
}

結果顯示:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章