【问题标题】:Recursion function to calculate the probability递归函数计算概率
【发布时间】:2021-05-03 23:51:27
【问题描述】:

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,但现在知道该怎么做了。

谢谢

【问题讨论】:

    标签: python recursion data-structures


    【解决方案1】:

    这基本上是条件概率。 将您的随机世界的实现想象为像 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))
    

    【讨论】:

    • @AcatAdog 非常重要,您了解条件概率的理论,而不仅仅是复制代码。
    • @goalie1998 确实
    • @AcatAdog 您可以将递归用于小问题作为演示。对于更大的 n,请参阅我的更新
    猜你喜欢
    • 2017-09-20
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2018-10-01
    • 2011-02-16
    • 2018-08-09
    相关资源
    最近更新 更多