题目4:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
还是和前面的题一样,这种题最简单的思路就是递归。第10次掉下所经过的总距离实际上就是前9次掉下经过的总距离再加上弹起来一次再加掉下去一次。
简单思考就可以想到,第n次掉下去的高度总是等于n-1次弹起来的高度,所以我们在程序中只需要计算出n-1次掉落后弹起来的高度,结果就可以出来了。弹起来的高度怎么算呢?我们先来推一下:
如题我们知道第一次掉下的高度为10,弹起来的是5,也就是(10/2);第二次掉下去的是5,弹起来的是2.5(也就是10/2²),第三次掉下去的是2.5,弹起来的是1.25(也就是10/2³)…那么,第n次弹起来的高度就是10/2ⁿ。
我们再回到题目,假入说设我们要求的次数为n,也就是我们要计算第n-1次弹起来的高度,才能得出第n次掉下去的高度。另外,题目中还要求算出第10次掉下去再弹起来多高,这个很简单,就是n-1次弹起来的高度÷2即可。
这一道题我们用 Python 的 class 类来解!因为跳动的小球可以看做一个类,它具有跳动次数的属性,以及算出总跳动距离、单次跳动距离的方法。上代码:
class ball_pop(object):
def __init__(self,times):
self.times = times
self.init_height = 100
def __get_distance(self,n):
if n == 1:
return self.init_height
return self.__get_distance(n-1)+self.init_height/2**(n-1)*2
# def get_distance(self): 从外部无参数计算总距离的备用方法
# return self.__get_distance(self.times)
def __get_ntimes_popup(self):
return self.init_height/2**(self.times-1)/2
def __call__(self):
print(f"小球第{self.times}次落下后经过的总距离为{self.__get_distance(self.times)}米, 第{self.times}落下后再弹起来的高度为{self.__get_ntimes_popup()}米")
ball = ball_pop(10)
ball()