非递归Python实现组合算法

非递归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、组合的实现方法何止千万,先手工写,然后总结其规律,然后将这个规律用程序表达出来,挺锻炼人的,不必人云亦云。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值