2013-10-19 111 views
0

我有兩個函數,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) 
+0

在另一方面,如果你想要做的排列和產品在Python,而不是僅僅FPGA實現他們提高自己的技能,迭代工具模塊是前進的方向。 – rlms

+0

你的遞歸'perm'也是錯誤的。僅適用於'k = 2'。 – Igonato

+0

@Igonato謝謝,更新。 – mathe

回答

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