python算法-排列組合


排列組合

一、遞歸

1、自己調用自己

2、找到一個退出的條件

 

二、全排列:針對給定的一組數據,給出包含所有數據的排列的組合

1:1

1,2:[[1,2],[2,1]]

1,2,3:【【1,2,3】,【1,3,2】,【2,1,3】,

【2,3,1】,【3,2,1】,【3,1,2】】

 

三、1,2,3 的全排列 --》[2,3]-》[2]

規律:以1開頭的[2,3]的全排列 + 以2開頭的[1,3]的全排列 + 以3開頭的[1,2]的全排列

-》

以1開頭的(以2開頭的[3]的全排列+以3開頭的[2]的全排列)的全排列 + 以2開頭的(以1開頭的[3]的全排列+以3開頭的[1]的全排列)的全排列  + 以3開頭的(以1開頭的[2]的全排列+以2開頭的[1]的全排列)的全排列

 

 

習題2:當只有一個數時,他的全排列的個數是幾?

答案:1

[2] ->[[2]]

[2,3] -》[[2,3],[3,2]]

表示全排列的時候,我們習慣使用列表來表示

 

四、全排列算法:

求n個數的全排列:

1、遍歷的抽取每一個數出來,求剩下n-1個數的全排列

2、針對n-1個數的全排列,抽取一個數出來,求剩下的n-2個數的全排列

3、循環上述的步驟,直到數字個數變成1,滿足遞歸的退出條件。

4、把上面所有的全排列求和,則是最終的全排列。

 

算法實現:

# encoding=utf-8

 

def perm(listVar):

    if len(listVar) == 1:

        return [listVar]

    retlist = []

    for i in xrange(len(listVar)):

        #得到一個新的列表,列表中去掉了i指向的元素

        restList = listVar[:i] + listVar[i+1:]

        # 1

        #perm([2,3])-> [[2,3],[3,2]]

        #1 加到 perm(2,3) 的結果中去

        perResult = perm(restList)

        for x in perResult:

            #習題:此行代碼是否可以這樣寫,為何?

            # retlist.append(listVar[i]+x)

            retlist.append(listVar[i:i+1]+x)

    return retlist

 

if __name__ == '__main__':

    print perm([1,2,3])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM