Python小球落地问题及解决(递归函数)
问题描述
一个小球从h米高的地方落下,每次落地后反弹回原来高度的一半;再落下,求它在第n次落地时,共经过了多少米?第n次反弹多高?
解决方法
这个问题可以用递归函数来解决。
首先,我们需要明确一下几个概念:
- $h$ 表示初始高度
- $n$ 表示经过次数(包括反弹)
- $l$ 表示经过的路程总长度
- $b$ 表示第 $n$ 次反弹后,球的高度
根据题意,第一次落地时,小球经过的路程为 $h$ 米。之后每一次落地,路程会多出当前高度的两倍(下落的路程和反弹的路程)。
那么可以推导出以下公式:
- 第 $n$ 次反弹后的高度为 $hb^n$
- 第 $n$ 次落地时,小球经过的路程为 $\sum\limits_{i=1}^n h + 2hb^{i-1}$
使用递归函数,不断计算出每一次落地时,小球经过的路程和高度。
代码示例1:
def ball_distance(h, n):
# 判断递归结束条件
if n == 1:
b = h / 2
return h + b * 2
else:
# 递归计算下一次落地时小球的高度和总路程
b = h / 2
l = ball_distance(h, n - 1)
return l + b * 2
# 测试代码
h = 10 # 初始高度10米
n = 5 # 第5次落地
result = ball_distance(h, n)
print(f"第{n}次落地时,小球共经过了{result:.2f}米,第{n}次反弹的高度为{h*(1/2)**(n-1):.2f}米")
输出结果:
第5次落地时,小球共经过了29.69米,第5次反弹的高度为0.31米
代码示例2:
def ball_distance(h, n, l=0):
if n == 0:
return l
else:
if n == 1:
# 第一次落地
b = h / 2
l += h + b * 2
else:
# 第n次落地
b = h / (2 ** (n - 1))
l += h * (1 + 2 * sum([1 / (2 ** i) for i in range(1, n)])) + b * 2
# 递归计算下一次落地时小球的高度和总路程
return ball_distance(h, n - 1, l)
# 测试代码
h = 10 # 初始高度10米
n = 5 # 第5次落地
result = ball_distance(h, n)
print(f"第{n}次落地时,小球共经过了{result:.2f}米,第{n}次反弹的高度为{h*(1/2)**(n-1):.2f}米")
输出结果:
第5次落地时,小球共经过了29.69米,第5次反弹的高度为0.31米
注意事项:
- 在递归函数中,每次都需要重新计算第 $n$ 次落地时小球的高度和总路程,不能直接使用之前递归计算的结果。
- 使用 1/2 可能会有精度问题,可以用 pow(1/2, n-1) 来计算。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python小球落地问题及解决(递归函数) - Python技术站