Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Programa para exibir todos os anagramas de uma palavras (sem usar o módulo itertools)

Estou tentando escrever um programa que exiba todos os anagramas de uma dada palavra mas sem usar o módulo itertools

Inicialmente pensei em fazer uma solução recursiva, mas não consegui todos os anagramas:

def anagrams(word):
    if len(word) == 1:
        return word
    elif len(word) == 2:
        return word[1:] + word[0],  word[0] + word[1:]

    else:
        return word[0] + str(anagrams(word[1:])), str(anagrams(word[1:])) + word[0]


word = "abc"


print(anagrams(word))

A saída foi:

("a('cb', 'bc')", "('cb', 'bc')a")

Além da saída estar bem "feia", só obtive 4 dos 6 anagramas possíveis:

acb, abc, cba,bca

Alguma ideia de como melhorar o código ou uma solução melhor?

2 respostas

Alguém poderia ajudar?

solução!

Faaala Edson, tudo bem?

Para este problema, uma solução recursiva será mais eficaz. A ideia geral é, ir quebrando a palavra e deixá-la com uma letra e esta letra, permutamos entre as demais, até que todas as letras da palavra sejam permutadas entre si. Pegou a ideia?

Veja:

def anagramas(palavra):
    if len(palavra) <=1:
        return palavra
    else:
        tmp = []
        for aux in anagramas(palavra[1:]):
            for i in range(len(palavra)):
                tmp.append(aux[:i] + palavra[0:1] + aux[i:])
        return tmp

print(anagramas('abc'))

Sugiro que você use o Pycharm e coloque breakpoints no código. Basta clicar na linha, como mostro na imagem abaixo. Para executar, clique em debug e observe o passo a passo, isto irá ajudá-lo a entender melhor todo o processo.

Exemplo

Qualquer dúvida, estou a disposição. Espero ter ajudado. Abraços e bons estudos!