• 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])
  • 相关阅读:
    Spring学习总结[1]-入门
    MyBatis学习总结[5]-动态 SQL
    MyBatis学习总结[4]-ResultMap子元素
    MyBatis学习总结[3]-多表查询
    MyBatis学习总结[2]-接口式调用
    MyBatis学习总结[1]-入门
    Bootstrap table两种分页示例
    spring ioc原理(看完后大家可以自己写一个spring)
    Junit4单元测试
    数字转换为字母有多少种方式
  • 原文地址:https://www.cnblogs.com/qingqing-919/p/9004258.html
Copyright © 2020-2023  润新知