Рекурсия с пониманием списка

Я пытаюсь решить проблему рекурсии для перечисления всей перестановки, учитывая строку и ее длину. Итак, у меня есть это решение

def bit_str(n, s):
    if n == 1:
        return s

    return [digit + bits for digit in bit_str(1, s) for bits in bit_str(n-1, s)]

Если вход bit_str(3, 'abc')результат будет ['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']

Может ли кто-нибудь сказать мне, что происходит в ответном заявлении? Я немного запутался с частью понимания списка.

1 ответ

Решение

Понимание списка

a = [b for b in c]

эквивалентно

a=[]
for b in c :
    a.append(b)

Итак, это:

a=[digit + bits for digit in bit_str(1, s) for bits in bit_str(n-1, s)]

будет так же, как

a=[]
for bits in bit_str(n-1,s):
    for digit in bit_str(1,s):
        a.append(digit+bits)

Демо-версия:

def bit_str(n, s):
    if n == 1:
        return s
    return [digit + bits for digit in bit_str(1, s) for bits in bit_str(n-1, s)]

def bit_str2(n, s):
    if(n==1):
        return s
    a=[]
    for digit in bit_str2(1,s) :
        for bits in bit_str2(n-1,s) :
            a.append(digit+bits)
    return a

print bit_str(3,'abc')
print bit_str2(3, 'abc')

Выход:

$ python p.py 
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']
Другие вопросы по тегам