0
votes

Comment faire de la récursivité précisément en python, y compris des listes?

Je suis un débutant essayant d'apprendre la récursion en Python. Je veux imprimer toutes les permutations d'une chaîne donnée. Par exemple:

Entrée : AABC

Sortie : AABC, AACB, ABAC, ABCA, ACAB, BAAC, BACA, BCAA, CAAB, CABA, CBAA

J'ai écrit le code suivant en Python en utilisant la récursivité.

def foo(str,count):
    result = ""
    while(any(count)):
        for i in range(len(count)):
            if count[i]>0:
                count[i] -= 1
                result = str[i] + foo(str,count)
                print(result)
    return result

s = "AABC"
n = 4

c = {}
for i in range(len(s)):
    if s[i] in c:
        c[s[i]] += 1
    else:
        c[s[i]] = 1

str = list(c.keys())
count = list(c.values())
print(str,count)
foo(str,count)
print(count)

Je reçois le résultat comme suit:

['A', 'B', 'C'] [2, 1, 1]

C

BC

ABC

AABC

[0, 0, 0]

Cela implique que le code ne gère que le premier cas à chaque niveau. Comment puis-je corriger ce code?
Toute aide serait merveilleuse.
Merci pour votre temps :)


3 commentaires

Est-ce que cela répond à votre question? Permutations de récursivité Python


À quoi sert count ?


Count sert à stocker le nombre d'occurrences de chaque caractère dans une chaîne.


3 Réponses :


1
votes

Je ne sais pas pourquoi vous utilisez count mais voici une façon de le faire de manière récursive (pas très optimale cependant). :

AABC
AACB
ABAC
ABCA
ACAB
ACBA
AABC
AACB
ABAC
ABCA
ACAB
ACBA
BAAC
BACA
BAAC
BACA
BCAA
BCAA
CAAB
CABA
CAAB
CABA
CBAA
CBAA

Sortie:

def foo(s,result):
    if len(result) == 4:
        print(result)
    if len(s) == 0:
        return
    for i in range(len(s)):
        new_s = s.copy()
        del new_s[i]
        foo(new_s,result + s[i])
s = list('AABC')
foo(s,'')

Si vous voulez des chaînes distinctes, vous pouvez les ajouter à un ensemble


0 commentaires

1
votes

Votre code semble un peu brouillon et j'ai du mal à comprendre comment vous avez essayé de résoudre votre problème avec celui-ci. J'ai essayé de créer une solution aussi simple que possible pour vous aider à comprendre la logique derrière la création de combinaisons de tout type de liste.

def combinations(x):
    if len(x) == 1:
        yield x
    for idx, i in enumerate(x):
        for comb in combinations(x[:idx]+x[idx+1:]):
            yield i + comb

s = "AABC"
print(list(combinations(s))) # -> ['AABC', 'AACB', 'ABAC', 'ABCA', 'ACAB' ...

x [: idx] + x [idx + 1:] ici est juste court de se débarrasser de l'élément de x à la position de idx . Ajoutez un commentaire si vous avez des questions afin que je puisse vous aider à mieux comprendre ma solution.


2 commentaires

Merci cela fonctionne. Mais je suis inconnu avec énumérable.


Si vous connaissez zip () , voici comment cela pourrait être implémenté zip (range (len (list)), list) . Également enumerate () documents



0
votes

J'ai trouvé quelque chose qui fonctionne mais qui donne des réponses en double à cause de multiples occurrences du caractère 'A', donc j'ai utilisé set () pour obtenir la réponse désirée.

def foo(s,l,result):
    if len(result)==4:
        l.append(result)
    for i in range(len(s)):
        foo(s[0:i]+s[i+1:],l,result+s[i])

s = "AABC"
l = []
r = foo(s,l,"")
print(list(set(l)))


0 commentaires