口袋里有一个白色的球和一个黑色的球。如果不放回去,求白球最后留在口袋里的概率。
设这个问题的解为f(m,n,a,b)。
讨论分类碰到的第一个球。第一个球可以是白球或黑球。
如果第一个球是白球,那么剩下的子问题就是f(m-1,n,a-1,b)。第一个球是白球的概率是【公式】。
如果第一个球是黑球,那么剩下的子问题就是f(m,n-1,a,b-1)。第一个球是黑球的概率是【公式】。
因此
[公式]
边缘条件是:[公式]
当b=0时,这个问题的答案很清楚:
[公式]
猜想f(m,n,a,b)也可能有某种简单的形式。
对于一元递推公式,我们可以通过求根+解方程来求通项。这个问题的多元递推公式有系统的解法吗?
f_dict = {}
定义f(m,n,a,b):
"""
m个白球,n个黑球,想摸一个白球,b个黑球。
精确结果用递归计算,结果用分数表示。
"""
断言a & gt= 0且b & gt= 0且m & gt= 0且n & gt= 0
断言a & lt= m和b & lt= n
param = (m,n,a,b)
if参数在f_dict中:
返回f_dict[param]
如果a == 0且b == 0:
f_dict[param] = 0
返回0
如果m == 0或n == 0:
f_dict[param] = max(a,b)
返回最大值(a,b)
x =分数(m,m + n)
y =分数(n,m + n)
ans = 1 + x * f(m - 1,n,max(a - 1,0),b) + y * f(m,n - 1,a,max(b - 1,0))
f_dict[param] = ans
返回答案
问题的根源
最近在做一个麻将游戏,需要实现一个麻将AI。
麻将AI的关键是评价一手牌情况的好坏:我用的是手牌情况和胡牌情况的最短距离,最短距离是“你预计摸多少次牌才能胡牌”。
麻将堆就像一个袋子。包里有34种球,每种球的个数都是几个。预计要摸几次才能摸到想要的“球型”。