题目来源: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)