2014-02-16 105 views
2

所以我知道這個話題已經被覆蓋了。但是,我在自己的實施中遇到了麻煩。使用遞歸在Python中查找列表的所有排列

def permutation(word, fixed = [], passed = ""): 
     if passed != "": 
      fixed.append(passed) 

     if len(word) == 1: 
      fixed.append(word[0]) 
      print fixed 
     else: 
      for i in range(len(word)): 
       passed = word[i] 
       rem = word[:i] + word[i+1:] 
       permutation(rem, fixed, passed) 

    permutation(["a","b","c"]) 
    raw_input() 

我想不要返回值,而是得到基地,然後打印結果。雖然我這樣做時,我得到如下:

['a', 'b', 'c'] 
    ['a', 'b', 'c', 'c', 'b'] 
    ['a', 'b', 'c', 'c', 'b', 'b', 'a', 'c'] 
    ['a', 'b', 'c', 'c', 'b', 'b', 'a', 'c', 'c', 'a'] 
    ['a', 'b', 'c', 'c', 'b', 'b', 'a', 'c', 'c', 'a', 'c', 'a', 'b'] 
    ['a', 'b', 'c', 'c', 'b', 'b', 'a', 'c', 'c', 'a', 'c', 'a', 'b', 'b', 'a'] 

這似乎接近,但是,我可以告訴大家,固定正在收集所有的輸出,我不完全理解爲什麼。

使用遞歸的時候,每個變量集合都是函數調用的局部變量嗎?這是我的理解,是這樣,但它似乎並不真正在這裏。

這不是家庭作業順便說一句。

對於任何有興趣更新代碼:

def permutation(word, fixed = "", passed = ""): 
     if passed != "": 
      fixed += passed 

     if len(word) == 1: 
      fixed += word[0] 
      print fixed 
     else: 
      for i in range(len(word)): 
       passed = word[i] 
       rem = word[:i] + word[i+1:] 
       permutation(rem, fixed, passed) 

    permutation(["a","b","c"]) 
    raw_input() 

它產生的輸出: ABC ACB BAC BCA 駕駛室 CBA

+0

如果它不是作業['itertools.permutations'](http://docs.python.org/2/library/itertools.html#itertools.permutations)? – thefourtheye

回答

0

你的函數傳遞到列表fixed的引用,所以你的功能可以改變它。對this question的接受答案有一個很好的解釋。

+0

我編輯我的代碼後閱讀它只使用字符串。非常感謝兄弟! – Josh