求子集(字母版)

题目来源:3943求子集

题目拷贝:

题目描述

监狱里除了修罗王以外,其他的囚犯都喜欢拉帮结派以壮大势力,但拉帮结派并不是无原则的,而是要看发展对象是不是看上去够顺眼,所谓顺眼,即是发展对象拥有的一些个性特征符合帮派的要求。例如N=3,表示符合帮派的个性特性共有3个,假设以a、b、c定义,我们称(a,b,c )为集合S,而发展对象只要拥有其中的一个或多个特征都会被帮派选中,即符合子集(S)={(),(a),(b),(c),(a,b),(b,c),(a,c),(a,b,c)}中的任何一个均可。当然,你可能要问了,这空集没有任何特征也符合条件?对啊,“和光同尘”也是一种很受大家欢迎的生活态度啊。

现输入N,求(S)的子集。

输入格式:

一个整数即N。

输出格式:

输出所有子集,每个子集占一行。

输入样例复制

5

输出样例复制

()
(e )
(d )
(d e )
(c )
(c e )
(c d )
(c d e )
(b )
(b e )
(b d )
(b d e )
(b c )
(b c e )
(b c d )
(b c d e )
(a )
(a e )
(a d )
(a d e )
(a c )
(a c e )
(a c d )
(a c d e )
(a b )
(a b e )
(a b d )
(a b d e )
(a b c )
(a b c e )
(a b c d )
(a b c d e )

说明

输出子集顺序要求严格按样例输出的顺序。
再比如输入为2时。
输出应该为:
( )
(b )
(a )
(a b )

解题:

运用两次递归加入每一种可能。

我的代码:

to=[]                             #所有数字集合
def tofind(n,arr,tmp):            #递归加入数组。 n=数组第几位,arr=数组,tmp=传递数组。
    if n==len(arr):               #控制退出
        return
    tofind(n+1,arr,tmp.copy())    #始终从最后一个开始加入
    tmp.append(arr[n])            #当前数组每次加入
    to.append(tmp)                #总数组储存
    tofind(n+1,arr,tmp.copy())    #当前数组再次递归
tofind(0,range(int(input())) ,[])                   
def prina(arr):                   #打印字母数组
    for i in arr:
        print("(",end='')
        for z in i:
            print(chr(97 + z),end=' ')
        print(")")
print("()")                       #空集合
prina(to)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值