给定一个数字,生成长度为n的X和O的所有可能组合的列表

时间:2014-03-17 04:43:22

标签: python recursion

例如,如果function(2)则产生

['XX','XO','OX','OO']

我不确定如何解决这个问题

4 个答案:

答案 0 :(得分:5)

除非这是一项任务,否则请使用itertools中的product,如下所示:

>>> import itertools as it
>>> list(it.product('XO', repeat=2))
[('X', 'X'), ('X', 'O'), ('O', 'X'), ('O', 'O')]

如果您想知道如何以“长”方式执行此操作,文档中提供了product方法的实现:

def product(*args, **kwds):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

答案 1 :(得分:2)

如果你想让你自己的功能做这样的事情:

def crossProduct(A, B):
    #returns cross product of elements in A x elements in B
    return [a+b for a in A for b in B]

suits = 'CDHS'
ranks = '123456789JQKA'

cards = cross(suits,ranks)

print cards # prints out all 52 cards 

答案 2 :(得分:0)

如果function(n - 1)生成长度为n - 1的所有可能组合的列表,则可以通过返回

递归生成长度为n的组合

1)' X'与function(n - 1)

中的每个元素连接在一起

2)' O'与function(n - 1)

中的每个元素连接在一起

像这样:

def function(n):
    if n < 1:
        return []
    elif n == 1:
        return ['X', 'O']
    else:
        return ['X' + string for string in function(n - 1)] + ['O' + string
            for string in function(n - 1)]

答案 3 :(得分:0)

如果您无法使用itertools,我建议您考虑binary number representation。如果您遍历02^n - 1之间的所有数字,则其0填充二进制表示将产生01的所有可能组合:

n = 3
for i in xrange(1<<n):
    print bin(i)[2:].zfill(n)

将打印:

000
001
010
011
100
101
110
111

(关于字符串操作,请参阅this question

该任务的剩余部分是如何将101转换为XOX,这可以手动完成,也可以使用maketrans / translate完成。

请注意,这仅适用于二进制字母,例如XO|-