python实现第二类Stirling数

python实现第二类Stirling数

第二类Stirling数是把包含n个元素的集合划分为正好k个非空子集的方法的数目。   

简单打个比方说就是n个不同集合分到k个相同的箱子里面有所少种可能

递推公式为:

S(n,k)=0; (n<k||k=0)   S(n,n) = S(n,1) = 1,   
S(n,k) = S(n-1,k-1) + kS(n-1,k).
考虑第p个物品,p可以单独构成一个非空集合,此时前p-1个物品构成k-1个非空的不可辨别的集合,方法数为S(p-1,k-1);也可以前p-1种物品构成k个非空的不可辨别的集合,第p个物品放入任意一个中,这样有k*S(p-1,k)种方法。

说明

程序中的total函数的功能是:想算n各元素的不论有几个分箱的总个数

S(4,0)+S(4,1)+S(4,2)+S(4,3)+S(4,4)=total(4)

假如想看8个元素分3个箱,只需程序中加入print(S(8,3)),即可在控制台查看结果 

#-*-encoding=utf-8-*-
import numpy as np
#第二类斯特林数
'''
n个元素的集合划分为正好k个非空子集的方法的数目
递推公式为:   S(n,k)=0; (n<k||k=0)   S(n,n) = S(n,1) = 1,   
S(n,k) = S(n-1,k-1) + kS(n-1,k).
'''
def S(n,m):
    if m>n or m==0:
        return  0
    if n==m:
        return 1
    if m==1:
        return 1
    return S(n-1,m-1)+S(n-1,m)*m

print S(4,0)+S(4,1)+S(4,2)+S(4,3)+S(4,4)

def total(n):
    sumtotal=0
    for i in np.arange(0,n+1,1):
        sumtotal=sumtotal+S(n,i)
    print sumtotal

total(4)

输出结果

15
15

假如想看所有列出的第二类stirling种类,可以查看我的另外一篇博客(文章原创,独特创新,转载记得说明),4个元素(1,2,3,4)所有分箱情况具体展示如下:

猜你喜欢

转载自blog.csdn.net/LuYi_WeiLin/article/details/85390096
今日推荐