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)所有分箱情况具体展示如下: