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):