Chcę mieć listę permutacji 123. Kiedy uruchomię ten kod, mówi:

TypeError: NoneType object is not an iterator

Kiedy prowadzę algorytm z "następnym", działa dobrze. Ale w ten sposób otrzymuję błąd. jakaś pomoc?

n = int(input())

elements = str(input())

elements = elements.split()

type(elements) == type([])

def factor(elements, i , n):

    if i == n - 1:
        return elements
    else:
        for j in range(i, n):
            elements[i], elements[j] = elements[j], elements[i]
            factor(elements, i + 1 , n)
            elements[i], elements[j] = elements[j], elements[i]

list = []

list = factor(elements, 0, n)

list = sorted(list) #error is for this part of code


while True :
    if list == [] : break
    else:
        print(list[0])
        list.pop(0)

Kiedy używam algorytmu w tym formularzu, działa dobrze:

def perm(n, i):
    if i == len(n) - 1:
        print(n)
    else:
        for j in range(i, len(n)):
            n[i], n[j] = n[j], n[i]
            perm(n, i + 1)
            n[i], n[j] = n[j], n[i]

perm([1, 2, 3], 0)
-1
user3015255 21 listopad 2013, 03:44

2 odpowiedzi

Najlepsza odpowiedź

Powód, dla którego działa:

def perm(n, i):
    if i == len(n) - 1:
        print(n)
    else:
        for j in range(i, len(n)):
            n[i], n[j] = n[j], n[i]
            perm(n, i + 1)
            n[i], n[j] = n[j], n[i]

Czy to nie zwracasz żadnej wartości, wystarczy drukować do ekranu. Jeśli chcesz zwrócić listę wszystkich wartości, które zostaną wydrukowane, musisz (a) zbudować tę listę i (b) zwróć tę listę.

I pamiętaj, przypadek bazy i Rekursywny przypadek będzie miała return lista, nie tylko jeden lub drugi.

def perm(n, i):
    if i == len(n) - 1:
        return [n]
    else:
        results = []
        for j in range(i, len(n)):
            n[i], n[j] = n[j], n[i]
            results.extend(perm(n, i + 1))
            n[i], n[j] = n[j], n[i]
        return results

Teraz zwraca teraz listę 6 list. Ale jest to problem inny , który musisz naprawić. Zamiast budować nową listę dla każdej permutacji, wyciszasz listę wejściową, a następnie go zwrócisz. Oznacza to, że skończysz z listą tej samej listy 6 razy. Aby to naprawić, potrzebujesz Kopiuj Lista przed powrotem. Więc:

def perm(n, i):
    if i == len(n) - 1:
        return [n[:]]
    else:
        results = []
        for j in range(i, len(n)):
            n[i], n[j] = n[j], n[i]
            results.extend(perm(n, i + 1))
            n[i], n[j] = n[j], n[i]
        return results
3
abarnert 21 listopad 2013, 00:03

Twoja funkcja czynnika nie zawsze zwraca wartość. Funkcja kończy się bez powrotu wartości, domyślnie zwraca żadnych. Lista staje się żadna, co nie jest sortowalne.

BTW, nie powinieneś używać "listy" jako nazwy zmiennej - to okluduje wbudowaną listę.

Ponadto, że type(elements) == type([]) - Czy powinno być stwierdzeniem?

2
dstromberg 20 listopad 2013, 23:50