红蓝球
题目描述
袋子中装有n个红球和m个蓝球,A,B,C,三人依次抽取小球,若A抽到红球则胜出,B抽到红球则A失败,C陪跑,纯粹出来捣乱。但如果袋内红球被抽完还未决断胜负,则判定为B胜出。
求A胜出概率。
解题思路
模拟抽球过程,采用递归的方式实现概率计算。
python代码
n, m = (int(x) for x in input().split())
def probability(n, m, p):
if n == 0: #若没有红球,则胜率为0
return 0
if m == 0: #若没有蓝球,分情况判断
if p == 'A': #该A抽,则胜出
return 1
if p == 'B': #该B抽,则失败
return 0
if p == 'C': #该C抽,则判断剩余红球数量
if n == 1: #数量为1,则红球被抽完,失败
return 0
else: #数量不为1,则C抽完A抽,胜利
return 1
if p == 'A': #若该A抽,条件概率计算如下
return n / (n + m) + m / (n + m) * probability(n, m - 1, 'B')
if p == 'B': #若该B抽,条件概率计算如下
return m / (n + m) * probability(n, m - 1, 'C')
if p == 'C': #若该C抽,条件概率计算如下
return (n / (n + m)) * probability(n - 1, m, 'A') + (m / (n + m)) * probability(n, m - 1, 'A')
win = probability(n, m, 'A') #A开始抽
print('%.5f' %win)
后记
通过率45%,递归超时,仅做参考