2017-01-23 133 views
1

如何格式化該函數以便遞歸地工作?如果可能的話,我想更深入多層次,而不僅僅是直到5.在python中遞歸排列排列

排列是一個具有不同排列的列表,這些排列也可以有排列等。我想根據我做的一些計算來排列它們get_permutations並返回排列的新順序。查看它的一個好方法可能是列表清單列表的大列表。首先,我想改變第一層次的順序,而不是一步深入,但最終我會根據這些排列返回字符串,而不是排列本身(如果有的話),res1 ... res5是字符串。即使我知道它應該是可能的,但我還不夠聰明,以遞歸方式工作......任何想法?

permutations, res1 = get_permutations(str, 1) 

for p2 in permutations: 
    permutations_2, res2 = get_permutations(p2,2) 

     for p3 in permutations_2: 
      permutations_3, res3 = get_permutations(p3,3) 

      for p4 in permutations_3: 
       permutations_4, res4 = get_permutations(p4, 4) 

       for p5 in permutations_4: 
        permutations_5, res5 = get_permutations(p5,5) 

       res4 += res5 
      res3 += res4  
     res2 += res3  
    res1 += res2 

return res1 

編輯:這將返回一個單一的(最好的)置換。這就是結果。因此,如答案中所提到的那樣,不是可能的排列列表。例如。如果我們有一個列表列表,如果首先根據所有子信息對列表進行排序,然後根據以前的排序和所有子信息對多個列表進行排序,然後根據以前的兩種排序列表對列表進行排序。

+0

你嘗試自己轉換呢?向我們展示您的嘗試 – depperm

+0

[Python排列遞歸]的可能重複(http://stackoverflow.com/questions/35814976/python-permutations-recursive) – schwobaseggl

回答

2

能產生預期順序排列相對於原始字符串遞歸發生器功能:

def get_permutations(a): 
    if len(a) <= 1: 
     yield a 
    else: 
     for i in xrange(len(a)): 
      for p in get_permutations(a[:i]+a[i+1:]): 
       yield ''.join([a[i]])+p 

>>> a = '123' 
>>> list(get_permutations(a)) 
['123', '132', '213', '231', '312', '321'] 

遞歸原理在這裏:

  1. 基本情況:lengthes (0, 1)的字符串只有一個排列:他們自己。

  2. 遞歸:對於字符串中的每個字母,將其移除並將其前置於字符串餘數的每個置換處。

0

下面的示例,此方法的工作原理是以遞歸方式嵌套for循環repeat-times。然後,我們積累子解決方案的結果,附加到一個結果列表:

result = [] 
def permutations(alphabet, repeat, total = ''): 
    if repeat >= 1: 
     for i in alphabet: 
      # Add the subsolutions.  
      permutations(alphabet, repeat - 1, total + i) 

    else: 
     result.append(total) 
    return result 

樣品輸出:

permutations('ab', 3) -> 
$ ['aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bba', 'bbb'] 
permutations('ab', 3) -> 
$ ['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 
    'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 
    'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc'] 
permutations('ab', 1) -> 
$ ['a', 'b'] 

來源:a previous answer of mine.