用python写的多重组合程序


               
               
               
                #muti combination problem
#e.g. choose 3 items from ['a','b'], duplication allowed
# [['a','a','a'],['a','a','b'],['a','b','b'],['b','b','b']]
def m_c(a,n):
    mapped_set=range(len(a)+n-1)
    mapped_result=com(mapped_set,n)
    return [[a[j-i.index(j)] for j in i] for i in mapped_result]
def com(a,n):
    if n>len(a):
        return []
    if n==len(a):
        return [a]
    if n==1:
        return [ for i in a]
    else:
        result=[]
        for i in xrange(len(a)):
            for x in com(a[i+1:],n-1):
                result.append([a]+x)
        return result
a=['a','b','c','d']
n=3
for i in m_c(a,n):
    print i
#for i in com(a,n):
#    print i
print 'total:', len(m_c(a,n))
#变量的命名是个很重要,很有技巧的问题
#不恰当的命名,比如在这个程序里,我把a列表中取出子的数目命名为n
#而一般来说,我会把列表长度命名为n
#事实上,程序写到后来,我以为n是a的长度,
#这个错误引用导致的程序结果的异样花了我好几个小时才找到根源