【问题标题】:non-recursive version Permutations非递归版本排列
【发布时间】:2013-10-19 12:06:08
【问题描述】:

我有两个函数,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)

【问题讨论】:

  • 另一方面,如果你想在 Python 中做排列和产品,而不是仅仅实现它们来提高你的技能,那么 itertools 模块是前进的方向。
  • 你的递归 perm 也错了。仅适用于k=2
  • @Igonato 谢谢,已更新。

标签: python recursion combinations permutation


【解决方案1】:

由于代码中的 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

【讨论】:

    【解决方案2】:

    漂亮的解决方案伙计们,这是一个适用于 Numba 的重写:

    @numba.njit()
    def permutations(A, k):
        r = [[i for i in range(0)]]
        for i in range(k):
            r = [[a] + b for a in A for b in r if (a in b)==False]
        return r
    permutations([1,2,3],3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2011-07-23
      • 2012-08-24
      • 2013-10-08
      • 2010-12-06
      • 1970-01-01
      相关资源
      最近更新 更多