python - 非递归版本排列

标签 python recursion combinations permutation

我有两个函数,prodperm。它们非常相似。它们都使用递归。现在我不想用 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/

相关文章:

c++ - 枚举值的组合爆炸(729 种组合...)

python - 如何从多个列表的每个唯一组合创建 pandas 数据框?

python - 如何使用 pyglet 循环限制 cpu 使用?

python - 在 `pip install` ing 时可选择排除一些依赖项

python - TensorFlow:更改使用主管进行训练时要保留的最大检查点数量?

python - 如何消除该函数中的一个参数?

haskell - 使用 Haskell 进行树遍历

python - 获取有向图的所有边对.networkx

python - 在Python中解析文本并返回不匹配括号的列表

windows - 按顺序递归重命名所有子文件夹中的文件