非递归Python组合算法
多说无益,直接上代码看吧,对照输出结果看算法思想。
def comb(s,m)->list: #组合的非递归算法
r=[] #存结果,是列表的列表
n=len(s)
if m<1 or n<m :
return r
mask=[] #下标列表
for i in range(m):
mask.append(i)
while True :
i=m-1
while mask[i]<=n-m+i:
t=[]
for k in range(m): #根据掩码生成一个组合
t.append(s[mask[k]])
r.append(t) #添加到结果中去
mask[i]+=1
if mask[0]>=n-m:break
i=i-1
while mask[i]>=n-m+i and i>0:i=i-1 #从右向左扫描
if mask[i]<n-m+i: #按从小到大的顺序排列,必符合这个规律
mask[i]+=1
for k in range(i+1,m):
mask[k]=mask[k-1]+1
return r
s=[]
t=input("输入待组合的字符串,逗号分隔:")
s=t.split(",")
m=int(input("组合的个数m="))
if m<1 or len(s)<m :
print("字符串为空,或m小于1")
exit
total=0
for a in comb(s,m):
print(a)
total+=1
print("total=",total)
几点说明:1、组合算法的实质是求下标,若求Cnm,则所求掩码的列表为i:0~m-1,并且下标严格递增。所以每个固定的位置其最大下标是n-m+i,若第一个mask[0]=n-m,证明已完成。2、函数comb的返回结果实际是列表的列表。3、组合的实现方法何止千万,先手工写,然后总结其规律,然后将这个规律用程序表达出来,挺锻炼人的,不必人云亦云。