用于制作123的排列列表的算法中的错误

时间:2013-11-20 23:44:38

标签: python algorithm

我想要列出123的排列。当我运行这段代码时,它说:

TypeError: NoneType object is not an iterator

当我使用'next'运行我的算法时,它运行正常。但这样我得到错误。有什么帮助吗?

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)

当我在这种形式下使用算法时,它可以正常工作:

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)

2 个答案:

答案 0 :(得分:3)

这是有效的原因:

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]

是不是你没有返回任何值,只是打印到屏幕上。如果要返回将要打印的所有值的列表,您必须(a)构建该列表,并(b)返回该列表。

请记住,基本案例递归案例都必须return一个列表,而不仅仅是一个或另一个。

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

现在返回6个列表的列表。但是你必须修复另一个问题。您不是为每个排列构建新列表,而是改变输入列表然后返回它。这意味着你最终会得到一个相同列表的列表6次。要解决此问题,您需要在返回之前复制列表。所以:

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

答案 1 :(得分:2)

您的因子函数并不总是返回值。在不返回值的情况下结束的函数会隐式返回None。因此列表变为无,这是不可排序的。

顺便说一句,你不应该使用“list”作为变量名 - 这将遮挡内置命名列表。

此外,type(elements) == type([]) - 它应该是一个断言声明吗?