Я изучаю Python и алгоритмы сортировки. Я хочу найти перестановки этой строки «AAABB», без повторений. Я должен получить ответ без использования циклов for и while, только рекурсия.
Я считаю, что эту проблему можно решить, создав три возможных случая.
Всегда будет возвращать A, если доступно
Всегда будет возвращать B, если доступно, и
W не вернет ничего, если не осталось доступных букв.
Пока я пробовал этот код:
#n1 = Amount of A available
#l1 = character A
#n2 = Amount of B available
#l2 = character B
def perm(n1,l1,n2,l2):
if n1 == 0: # Run out of A?
if n2 == 0: # Yes, no A left. Run out of B?:
return '\n' # Yes, no A nor B left, then do nothing
else: # No, still have B, then:
return l2 + perm(n1,l1,n2-1,l2) # Return B
else: # No, still have A, then :
if n2 == 0: # Run out of B?
return l1 + perm(n1-1,l1,n2,l2) # Yes, no B left, then return A
else: # No, still have B, then:
return l1+perm(n1-1,l1,n2,l2) + l2+perm(n1,l1,n2-1,l2) # Return both
print(perm(3,'A',2,'B'))
Этот код возвращает 10 неполных перестановок:
AAABB BAB BA BAAB BA BAA BAAAB BA BAA BAAA
Я ожидаю получить 10 полных перестановок:
AAABB AABBA AABAB ABBAA ABABA ABAAB BAABA BAAAB BABAA BBAAA.
Есть ли у вас какие-либо идеи о том, как я могу улучшить свой код или какое условие мне не хватает?