题目要求:
P(n,k)代表将n个元素分成k个非空分组集合的总集。例如,当L=[1,2,3], P(3,2)=12,3; 13,2; 1,23.我们就假设此n个元素是从1到n。P(4,3)=1,2,34; 14,2,3; 1, 24, 3; 12, 3, 4; 4,13, 2; 23, 1, 4. 这6个 ,次序不拘。
思想:结果列表R是三重列表,一个集合放在一个二重列表中,所有的集合放在一个三重列表R中。
此题目的思想类似于在解组合问题时的思想。此将问题分为两部分:L1表示选取L[0]作为一组,其他n-1个元素分成k-1组;L2表示把除了L[0]之外的分成k组,L[0]插入到这k个组中。递归处理。
代码如下:
#此程序的作用:将n个元素分成k组,输出分组
def divide_set(L,k):#把L分成k组
if k==0:return [[[]]]
if k==1:return [[L]]
L1=[];L2=[]
if len(L)-1>=k:
L2=divide_set(L[1:],k) #把除了第一个元素之外的分成k组,第一个元素插入到其中
#print(L2)
if len(L)>=k:
L1=divide_set(L[1:],k-1)#把第一个元素作为一组,其他分成k-1组