2015-01-03 30 views
0

我想排列一個列表,但我不能這樣做,它走向無限循環。我嘗試不同的東西,但不知何故唯一,它顯示我是1 2 3 ... 1個2 3等回溯排列列表

這是代碼:

def prints(v,k): 
    s = '' 
    for i in range(k + 1): 
     s += str(v[i]) + ' ' 
    print(s) 

def continuare(v,k): 
    ok = True 
    for i in range(k): 
     if v[i] == v[k]: 
      ok = False 
      break 
    return ok 

def back(v,a): 
    k = 0 
    caut = False 
    while k>-1: 
     caut = False   
     pos = 0 
     while pos < len(a) and caut == False: 
       v[k] = a[pos] 
       pos += 1 
       if continuare(v,k): 
        caut = True 
     if caut == False: 
      k -= 1 
     elif k == len(a) - 1: 
      prints(v,k) 
     else: 
      k += 1 


a = [1,2,3] 
v = [] 
for x in range(len(a)): 
    v.append(a[0]) 
back(v,a) 
+0

您是否有預期輸出的樣本輸入? – Jivan

+0

我希望程序排列列表a。輸出應該是這樣的:123 132 213 231 312 321 – KangJiYoung13

+2

你想要列表的所有排列?使用[itertools.permutations](https://docs.python.org/2/library/itertools.html#itertools.permutations)。 –

回答

1

下面是從http://www.geeksforgeeks.org/write-a-c-program-to-print-all-permutations-of-a-given-string/一個簡單的Python轉錄:

def swap(a, i, j): 
    a[i], a[j] = a[j], a[i] 

def permute(a, i, n): 
    if i == n: 
     print(a) 
     return 
    for j in range(i, n+1): 
     swap(a, i, j) 
     permute(a, i+1, n) 
     swap(a, i, j) # backtrack 

def main(): 
    a = list('ABC') 
    permute(a, 0, 2) 

if __name__ == '__main__': 
    main() 

我寧願有permute爲發電機產生的排列,與main循環對他們進行打印,但是這可能是更接近原C,從而更容易執行。請注意,一個區別是必須的:這裏正在進行的排序是一個列表,而不是C源代碼中的字符串,因爲字符串在Python中是不可變的(所以swap將需要大不相同的邏輯,返回「字符串與交換字符」而不是因爲「回溯」邏輯需要能夠在原地工作)。

+0

爲什麼是返回必要? –

+1

@PadraicCunningham它不是**必需** - 您可以將'for'循環嵌套到'else'分支中。然而,** flat比嵌套更好**:一旦知道它已經完成,就離開函數(或循環),而不是將大量代碼嵌套在「else」分支中,這是更爲Pythonic的成語。 –