口袋里有一个白色的球和一个黑色的球。如果不放回去,求白球最后留在口袋里的概率。

这个问题其实是一个四元递归公式。我只会写递归公式,找不到通式。

设这个问题的解为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种球,每种球的个数都是几个。预计要摸几次才能摸到想要的“球型”。