我想要列出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)
答案 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([])
- 它应该是一个断言声明吗?