Combination
从n个不同的元素中任取m(m <= n)个, 若不考虑顺序, 叫做从n个元素中取出m个元素的一个组合, 记为 Cmn
所有的组合数:
C0n+C1n+C2n+...+Cnn=2n
递归求所有的组合
给定一个长度为n的列表L, 求从L中取1个, 取2个… 取n个的所有组合.
可以把这个问题分为三个子问题进行递归求解:
- 仅有第一个元素a1组成
- 除第一个元素意外的其它元素 [a2,a3,...an] 的组合
- 把a1加入到第2步的每一个结果中
代码
def combination(L):
length = len(L)
#仅有一个元素的时候终止
if length == 1:
return [[L[0]]]
else:
LL = []
a1 = L[0]
#1. 仅有第一个元素a1组成
LL.append([a1])
#2. 后续n-1元素的所有组合
n1_combination = combination(L[1:])
for T in n1_combination:
LL.append(T[::])
#3. 把a1加入到第2步的每一个结果中
for T in n1_combination:
T.insert(0, a1)
LL.append(T[::])
return LL
测试
def main():
L = ['A', 'B', 'C', 'D']
LL = combination(L)
for i in range(len(LL)):
print LL[i]
输出结果
['A']
['B']
['C']
['D']
['C', 'D']
['B', 'C']
['B', 'D']
['B', 'C', 'D']
['A', 'B']
['A', 'C']
['A', 'D']
['A', 'C', 'D']
['A', 'B', 'C']
['A', 'B', 'D']
['A', 'B', 'C', 'D']
Cmn
若求从n个元素中取得m个元素的组合, 可以对上述列表进行过滤, 找出长度为m的即可.
Pmn
若求从n个元素中取得m个元素的排列, 可以针对上一步求出的每一个组合做全排列即可.