我有两个函数,prod
和 perm
。它们非常相似。它们都使用递归。现在我不想用 for 循环替换递归。 prod2
工作正常,但 perm2
不正常,我该如何解决?
#Recursive version:
def prod(A,k):
return [[]] if k==0 else [[a]+b for a in A for b in prod(A,k-1)]
def perm(A,k):
return [[]] if k==0 else [[a]+b for a in A for b in perm([i for i in A if i!=a],k-1)]
#NonRecursive version:
def prod2(A,k):
r=[[]]
for i in range(k):
r=[[a]+b for a in A for b in r]
return r
def perm2(A,k):
r=[[]]
for i in range(k):
r=[[a]+b for a in A for b in [i for i in r if i!=a ] ]
return r
print prod([1,2,3],2)
print prod2([1,2,3],2)
print perm([1,2,3],2)
print perm2([1,2,3],2)
最佳答案
由于代码中的 r
变量包含列表,i != a
将始终为 True
。以下是修复方法:
def perm2(A, k):
r = [[]]
for i in range(k):
r = [[a] + b for a in A for b in [i for i in r if a not in i]]
return r
或者简单地说:
def perm2(A, k):
r = [[]]
for i in range(k):
r = [[a] + b for a in A for b in r if a not in b]
return r
关于python - 非递归版本排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19465832/