计算概率的递归函数
A 要么以 1 - p 的概率赶上他的公共汽车,要么以 p 的概率错过它。在前一种情况下,他准时到办公室,在后一种情况下他迟到了。A 知道如果 A 连续两天迟到,他的老板会生气。对于给定的天数 n 和给定 p,A 想要计算 n 天后他的老板不会生气的概率。
例如,如果 n = 2,那么让老板生气的唯一方法就是两天都迟到。因为,不同天的事件是独立的,所以这个事件的概率是p*p = p^2。所以,不惹老板生气的概率是1 - p^2
def probability_not_angry(n, p):
if n == 0:
return 1
if n == 1:
return 1
return probability_not_angry(n-1, p) + probability_not_angry(n-2, p)
# should print 0.5
print(probability_not_angry(4, 0.5))
# should print 0.4375
print(probability_not_angry(2, 0.75))
我不知道如何解决这个问题。如果返回probability_not_angry(n-1,p)+probability_not_angry(n-2,p),它只计算n,所以我必须改变函数中的p,但现在知道怎么做。
谢谢
回答
这基本上是条件概率。将您的随机世界的实现视为像 CMCCMC.... 为 Catch/Miss 这样的序列。Not-Angry 表示序列中没有 MM。从头开始递归:如果 C 发生(概率为 1-p),则问题变为 (n-1,p)。如果 MC 发生,概率为 (1-p)*p,问题变为 (n-2,p)。您不需要考虑 MM 何时发生,因为(不生气的)条件概率为 0。
def probability_not_angry(n, p):
if n <2:
return 1
return (1-p)*probability_not_angry(n-1, p) + p*(1-p)*probability_not_angry(n-2, p)
顺便说一句,即使使用正确的缓存,这种递归的计算复杂度也不是很大。正确的方法是线性求解:
def Linear(n,p):
R=[1,1]
for _ in range(n-1):
R.append((1-p)*R[-1]+(1-p)*p*R[-2])
return R[-1]
print(Linear(4,0.5))
print(Linear(2,0.75))