我所知道的全排列有四种:

1.迭代的排列组合全排列(非递归):字典序的大小,即传说中的A33

2.邻位置对换的全排列(非递归):

方法一:生成下一个排列,该方法对重复元素同样有效

如果可以根据一个排列生成他的下一个排列,那么生成所有排列也就不在话下了,下面以排列625431为例来说明怎么生成下一个排列,首先从右向左找到第一个降序对,这里是25,然后将前面的数字与其后面的大于它的最小数字相替换,这里是指将2与2后面的大于2的最小数字相替换,被替换数字是3,替换后的序列是635421,此时3后面的数字肯定是一个降序(从左到右)序列,将这个序列颠倒即可,得到631245,这就是625431的下一个序列,初始时应将元素排序,然后逐个生成;

方法二:生成第n个排列

m个元素的排列总数为m!; 假设m个元素初始时已经升序放入集合key中,则第n个排列的第一个元素必然是集合key中第n/(m-1)! 小元素,记为kx, 设定最小元素为第0小元素;接下来在集合key-{kx}中找出第n%(m-1)!个排列;以此类推,迭代找出所求排列的所有元素;

如果有重复元素,则m个元素的排列总数为m1! /(c1! * c2! *….cn!),ci为元素ki的重复次数;集合key也是一个多重集,对重复元素每次也只删除一个;

3.交换位置的递归全排列:代码展示

#all permutationdef printInfo():print("test info")def swap(array, end, start):temp = array[end]array[end] = array[start]array[start] = tempdef isSwap(array, end, start):for i in range(start, end):if(array[i] == array[end]):return Falsereturn Truedef all_Permutation(array, n):if n == len(array):print(array)returnfor i in range(n, len(array)):if not isSwap(array,i, n):returnswap(array,i,n)all_Permutation(array, n+1)swap(array, i, n)if __name__ == '__main__':array = ['a','c','c']all_Permutation(array, 0)

4.索引数组选择的全排列:代码展示

python 全排列 递归中的两种实现相关推荐

  1. python文字教程-Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.Ope ...

  2. python怎么模拟浏览器交互_干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏)...

    今天为大家带来的内容是:干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏) 文章主要介绍了python爬虫模拟浏览器的两种方法,结合实例形式分析了Python爬虫模拟浏览器的两种常见操 ...

  3. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

  4. 递归和循环两种方法完成树的镜像转换

    /* copyright@nciaebupt 转载出处:http://blog.csdn.net/nciaebupt/article/details/8506038 题目:输入一颗二元查找树,将该树转 ...

  5. python 手动安装包的两种方法

    python 手动安装包的两种方法 对于 .tar.gz 的包来说 解压缩文件 aaaxxxx-1.0.1.tar.gz 移动到压缩文件所在目录 使用tar -zxvf aaaxxxx-1.0.1.t ...

  6. django + python上传文件的两种方式

    突然心血来潮,研究了下django+python上传文件的两种方式. 第一:直接采用文件读写的方式上传 1. settings.py文件中设置文件的存放路径和文件读取路径 MEDIA_ROOT = o ...

  7. 水平集方法引入主动轮廓模型算法中的两种方法

    水平集方法引入主动轮廓模型算法中的两种方法 1.传统的基于主动轮廓模型和水平集理论的方法 2.变分水平集方法 在讲解水平集理论在主动轮廓模型中的应用前,我们先用流程图说明一下常见的处理主动轮廓模型的流 ...

  8. Python实现图片裁剪的两种方式——Pillow和OpenCV

    在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. 首先,我们有 ...

  9. 基于python实现车辆测速两种的方法

    基于python实现车辆测速两种的方法 姓名:黄镜轩 院系:机电工程学院 班级:车辆工程1班 联系方式:QQ - 3326078070 本文参考了: 案例-使用python实现基于opencv的车辆识 ...

最新文章

  1. Centos 6.5 监控路由器、思科交换机Nagios (三)
  2. OpenStack Nova 计算节点的维护模式
  3. Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
  4. 程序员,如何摆脱平庸?
  5. objective-c 类目(Category)和延展(Extension)
  6. 迭代求斐波那契数列python_python中的迭代器(以斐波那契数列为主讲解)
  7. hadoop Connection refused: no further information原因排查(Centos7)
  8. Redis:11---Set对象
  9. 8000字干货扫除你的焦虑!3点钟无眠区块链群聊最全精华
  10. 【C语言】删除元素(函数,数组的扫描)
  11. 漫画 | 硬核技术预测你有没有女朋友
  12. Jackson2 json 转换Bean, Bean 里没有对应的值 jackson Un的解决方式
  13. MATLAB资源安装免费激活完整步骤
  14. python鸢尾花数据集knn_机器学习(基于Python) 重写Knn算法(鸢尾花数据集)
  15. 易语言取DOS执行结果
  16. MSP430学习笔记(一)--从点灯说起
  17. 淘宝数据库,主键如何设计以及自增ID的问题
  18. 关于程序员的那些段子,你能看懂几个?
  19. MySQL高级篇知识点——MySQL 事务日志
  20. 手机模型真机图片的制作——UI出图

热门文章

  1. Adapter适配器
  2. CNN卷积层神经元数量、连接数量、权重数量的计算
  3. 三大类计算机语言的相关知识,计算机语言有哪些
  4. 香颂花园是申市最有名的别墅区
  5. 研习社实战营--朱老师、猫老师,手把手带你入场打猎!
  6. 改变中国软件教育,我们正在行动
  7. 运维企业实战——RHCS集群套件 实现高可用
  8. 划重点了!2021软考网工考试范围重点圈定!
  9. Android7.1.2源码解析系列】Android编译系统翻译------Android_Build_System(/build/core/build-system.html)
  10. LeetCode 1079 活字印刷