排列组合

一、递归

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:]

        #

        #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])

最新文章

  1. Coreseek 安装指南
  2. 初识html5 File API实现带有进度提示的文件上传
  3. loj 1038(dp求期望)
  4. sass初步认识2
  5. nagios架构及windows,linux客户端配置
  6. Spring笔记(二)Core层
  7. hdu 2821 Pusher(dfs)
  8. lua 基本
  9. centos 下 搭建 php 环境
  10. ROM包内的大致框架及各个文件的作用[转]
  11. Activity的onSaveInstanceState()和onRestoreInstanceState()以及API详解
  12. mysql 在创建批处理脚本日志表信息
  13. 【渗透课程】前言-揭开Web渗透与安全的面纱(必看)
  14. 引入Log4j
  15. redux学习日志:关于异步action
  16. java从文件中读取json
  17. 【uWSGI】 listen queue of socket (fd: 3) 错误分析
  18. C# 创建邮件合并模板并合并文本、图片
  19. (4)logging(日志模块)
  20. windows server dump文件

热门文章

  1. 使用AuthToken架构保护用户帐号验证Cookie的安全性
  2. 洛谷P2606 [ZJOI2010]排列计数(组合数 dp)
  3. ArcSDE 10.1 For Windows 创建空间数据库与常见错误_SQL Server
  4. Lucene-如何编写Lucene程序
  5. ubuntu下安装ffmpeg扩展
  6. POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
  7. Ecshop首页购物车数量调取问题
  8. Bootstrap历练实例:默认的Well
  9. JVM内存模型与GC算法(简介)
  10. iOS小技巧–用runtime 解决UIButton 重复点击问题