/* 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下, 求它在第10次落地时,共经过多少米?第10次反弹多高 这里用BigDecimal避免精度丢失 */ class FreeFallingBody { fun tradition() { //传统算法 循环10次计算这里用BigDecimal避免精度丢失 val distance = BigDecimal(100.0) var height = BigDecimal(100.0) var result: BigDecimal? = null val percentage = BigDecimal(2.0) for (i in 0..9) { height = height.divide(percentage) if (result == null) result = distance.add(height) else result = result.add(height) //System.out.println("distance" + result); } println(result) } /** * 这里用BigDecimal避免精度丢失 * 以1为次数起点正向递归求第n次后自由落体后小球运动了多少距离 * 自定义求第n次后自由落体后小球运动了多少距离 * 以及逆向求第k次前的第n次之间自由落体后小球运动了多少距离 * 递归逆向求运动距离时候distance第一次运动距离为 0 */ fun diyFreeFallingBody(fallingTimes: Int, thisTimes: Int, height: BigDecimal, percentageHeight: BigDecimal, distance: BigDecimal): BigDecimal { var distance = distance /**所求落体次数相同则直接返回高度 */ if (thisTimes == fallingTimes) return distance.add(height.divide(percentageHeight)) else if (thisTimes < fallingTimes) { /**反复正向递归求下一次自由落体高度 */ if (thisTimes == 1) distance = height val nextHeight = height.divide(percentageHeight) return diyFreeFallingBody(fallingTimes, thisTimes + 1, nextHeight, percentageHeight, distance.add(nextHeight)) } else if (thisTimes > fallingTimes + 1) { /**反复逆向递归求下一次自由落体高度 */ val lastHeight = height.multiply(percentageHeight) if (distance.toInt() == 0) distance = height println("distance$distance") return diyFreeFallingBody(fallingTimes, thisTimes - 1, lastHeight, percentageHeight, distance.add(lastHeight)) } else if (thisTimes == fallingTimes + 1) { return distanKotlince.add(height.multiply(percentageHeight)) } return BigDecimal(0) } }
Kotlin算法入门求自由落体
猜你喜欢
转载自blog.csdn.net/qq_29856589/article/details/80140864
今日推荐
周排行