给定一个数组,输出其全组合 例如 123 输出 1,2,3,12,13,23,123
解法一:
对于N位数据,考虑每一位对于组合结果的影响,对于每一位可以选择取或者不取。一共有power(2,n)中取法,当全部不取时,对于最后结果没有意义,因此最终取法共有power(2,n)-1.可以利用二进制数字从1变为N,刚好变化过程中的二进制01分别对应每一位的取值情况,输出每一种情况即可。
def combination(num):
n = len(num)
nbit = 1 << n
for i in range(0, nbit):
for j in range(0, n):
tmp = 1 << j
if tmp&i != 0:
print (num[j],end='')
print ()
假设输入1234, 首先求出数组长度n=4, 构造power(2,n)-1 例如n=4 则nbit=1111, 注意数组下标从0开始
变量i从0000---1111 若i=1001,说明数组的第0位以及第3位被选择,可以输出
j表示数组的左起第几位需要输出,若j=0,说明当前为数组第0位 j=n-1说明当前为数组第n-1位
然后j依次搜寻i个二进制各位如果某一位等于1,则把相应的num[j]给输出即可。
解法二:
给定N位数据,其全组合的选择长度依次为1,2.。。。N.现在考虑长度为k的组合序列,若要产生长度为k的序列,考虑第1位,若选择第一位,则从后面n-1中选择k-1位分别与第一位组合即可,若选择第二位,则从后面n-2位中选择k-1位即可。由于k<=n,临界条件是k==0,此时直接返回空即可。
产生长度为k的序列如下:
def combination_k(num, k):
r = []
if k==0:
return ['']
for i in range(len(num)):
for letter in combination_k(num[i+1:], k-1):
#print ("letter",letter)
r += [num[i]+letter]
return r
遍历所有的k的取值,得到全组合:
扫描二维码关注公众号,回复:
4095293 查看本文章
def combination_all(num):
all = []
for i in range(1,len(num)+1):
all += combination_k(num, i)
return all