Вот короче рекурсивная функция, чтобы найти все перестановки букв в строке:
def gen_perms(n,text):
if n == 1:
return {a for a in text}
temp = {a + b
for a in text
for b in gen_perms(n-1,text)}
return temp
n
является длина слов/наборов, которые вы хотите сгенерировать
text
- это набор букв, которые вы хотите использовать.
Я использую наборы, потому что у них нет дубликатов записей; только уникальные элементы.
Чтобы объяснить алгоритм, начните с базового случая n = 1. Этот особый случай рассматривается, возвращая каждую из букв.
if n == 1:
return {a for a in text}
Пример, когда n
= 1, text
= 'уг':
>>> perms = gen_perms(1,'yz')
>>> print len(perms)
2
>>> print sorted(perms)
['y', 'z']
При п = 2, мы рекурсивно запустить функцию, так что думать о базовом случае сверху возвращается на этом line:
{a + b
for a in text
for b in gen_perms(n-1,text)}
и добавление каждой возможной буквы на это. Я буду переписывать его с text
заменены значениями мы вошли:
{a + b
for a in 'yz'
for b in ['y','z']}
Надеюсь, вы можете увидеть, что мы получим ['yy', 'yz', 'zy', 'zz']
, и мы делаем:
>>> perms = gen_perms(2,'yz')
>>> print len(perms)
4
>>> print sorted(perms)
['yy', 'yz', 'zy', 'zz']
Наборы очень приятно использовать здесь , потому что, если мы изменим наш текст, чтобы содержать повторяющиеся буквы, они не учитываются:
>>> perms = gen_perms(2,'yyyzz')
>>> print len(perms)
4
>>> print sorted(perms)
['yy', 'yz', 'zy', 'zz']
Отлично! Но как это работает? Это отличный трюк в python, но мне нужно знать, как работает алгоритм. может кто-нибудь попытаться написать его в C++? – oridamari