Permutations de récursion Python

J'ai du mal à faire un code de permutation avec récursion. Ceci est supposé retourner une liste de retour à l'utilisation avec toute la position possible pour chaque lettre. donc pour le mot cat il est supposé retourner ['cat','act',atc,'cta','tca','tac'] . jusqu'à présent, j'ai ce

def permutations(s):
    lst=[]
    if len(s) == 1 or len(s) == 0 :
        # Return a list containing the string, not the string
        return [s]
    # Call permutations to get the permutations that don't include the
    # first character of s
    plst = permutations(s[1:])
    print(plst)
    for item in plst:
        print (item)
        plst= permutations(s[1+1:])

         # Now move through each possible position of the first character
        # and create a new string that puts that character into the strings
        # in plst
        for i in range(len(s)):
            pass
            # Create a new string out of item
            # and put it into lst
        # Modify
    for item in lst:
        print(index)

Il y a des étapes, mais im pas sûr de savoir comment les utiliser

6
demandé sur Ashwini Chaudhary 2012-10-28 17:43:18

5 réponses

vous voulez faire la récursion, donc vous devez d'abord savoir comment la récursion fonctionnerait. Dans ce cas, il est le suivant:

permutation [a,b,c,...] = [a + permutation[b,c,...], b + permutation[a,c,..], ...]

et comme condition finale:

permutation [a] = [a]

ainsi la récursion divise la liste en sous-listes avec un élément extrait à chaque fois. Cet élément est ensuite ajouté au recto de chacune des permutations de la sous-liste.

donc en pseudo-code:

def permutation(s):
   if len(s) == 1:
     return [s]

   perm_list = [] # resulting list
   for a in s:
     remaining_elements = [x for x in s if x != a]
     z = permutation(remaining_elements) # permutations of sublist

     for t in z:
       perm_list.append([a] + t)

   return perm_list

est-ce que ça aide?

18
répondu Ben Ruijl 2014-10-19 16:56:22

pensez récursivement au scénario de base et construisez à partir de cette intuition.

1) Que se passe-t-il lorsqu'il n'y a qu'un caractère 'c'? Il n'y a qu'une seule permutation de cet élément, et donc nous retournons une liste contenant seulement cet élément.

2) Comment Pouvons-nous Générer la permutation suivante étant donné la dernière? Ajouter une lettre supplémentaire " a "à toutes les positions possibles dans la permutation précédente" c "nous donne "ca", "ac".

3) Nous pouvons continuer à construire des permutations de plus en plus grandes en ajoutant un caractère additionnel à toutes les positions possibles dans chaque permutation antérieure.

Le code suivant renvoie une liste d'un caractère si la chaîne a un caractère ou moins. Sinon, pour toutes les permutations n'incluant pas le dernier caractère de la chaîne s[-1], nous générons une nouvelle chaîne pour chaque position où nous pourrions inclure ce caractère et ajouter la nouvelle chaîne à notre liste actuelle de permutations.

def permutations(s):
    if len(s) <= 1:
        return [s]
    else:
        perms = []
        for e in permutations(s[:-1]):
            for i in xrange(len(e)+1):
                perms.append(e[:i] + s[-1] + e[i:])
        return perms
5
répondu stroz 2016-06-13 21:09:47

quand vous êtes perdu dans la fonction récursive, vous devriez dessiner l'arbre d'appel. La version suivante (inspiré @Ben réponse) garder l'entrée de commande (si l'entrée est dans l'ordre lexicographique, la liste des permutations seront, '012' -> ['012', '021', '102', '120', '201', '210'] .

def permut2(mystr):
    if len(mystr) <= 1:
        return [mystr]
    res = []
    for elt in mystr:
        permutations = permut2(mystr.replace(elt, ""))
        for permutation in permutations:
            res.append(elt + permutation)
    return res

la version suivante fonctionne pour les chaînes et les listes, notez que l'étape de reconstruction n'est pas la même:

def permut(array):
    if len(array) == 1:
        return [array]
    res = []
    for permutation in permut(array[1:]):
        for i in range(len(array)):
            res.append(permutation[:i] + array[0:1] + permutation[i:])
    return res

comme un exercice, vous devriez dessiner l'arbre d'appel des ces fonctions, faites-vous remarquez quelque chose ?

4
répondu Maxime 2013-04-08 14:54:19
def permutations(string_input, array, fixed_value=""):
    for ch in string_input:
        permutations(string_input.replace(ch, ""), array, fixed_value + ch)
    if not string_input:
        array.append(fixed_value)

vous pouvez l'appeler par

array = []
permutations("cat", array)
print array
1
répondu Nicolas Charabaty 2017-10-16 14:04:14

je sais que c'est un moi aussi, mais je pense que cela pourrait être plus facile pour certaines personnes de comprendre....

  1. le cas de base est lorsque l'entrée n'est qu'un caractère.
  2. configure une boucle for qui itère à travers chacune des lettres de la chaîne.
  3. un autre pour boucle Permute récursivement à travers toutes les autres possibilités.

def permuter(s):

out = []

if len(s) == 1:
    out = [s]
else:
    for i,let in enumerate(s):
        for perm in permute(s[:i]+s[i+1:]):
            out += [let+perm]
return out
0
répondu sparrow 2018-09-11 01:12:09