Python递归实现全排列

Python递归实现全排列排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;全排列:当n==m时,称为全排列;比如:集合{1,2,3}的全排列为:{123} {132}{213}{231}{321}{312}递归思想:取出数组中第一个元素放到最后,即a[1]与a[n]交换,然后递归求a[n-1]的全

大家好,又见面了,我是你们的朋友全栈君。

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;

全排列:当n==m时,称为全排列;


比如:集合{ 1,2,3}的全排列为:
{ 1 2 3} 
{ 1 3 2 }
{ 2 1 3 }
{ 2 3 1 }
{ 3 2 1 }
{ 3 1 2 }

递归思想:

取出数组中第一个元素放到最后,即a[1]与a[n]交换,然后递归求a[n-1]的全排列

1)如果数组只有一个元素n=1,a={1} 则全排列就是{1}

2)如果数组有两个元素n=2,a={1,2} 则全排列是:


{2,1}–a[1]与a[2]交换。交换后求a[2-1]={2}的全排列,归结到1)


{1,2}–a[2]与a[2]交换。交换后求a[2-1]={1}的全排列,归结到1)

3)如果数组有三个元素n=3,a={1,2,3} 则全排列是


{
{2,3},1}–a[1]与a[3]交换。后求a[3-1]={2,3}的全排列,归结到2)


{
{1,3},2)–a[2]与a[3]交换。后求a[3-1]={1,3}的全排列,归结到2)


{
{1,2},3)–a[3]与a[3]交换。后求a[3-1]={1,2}的全排列,归结到2)



依此类推。


利用python实现全排列的具体代码perm.py如下:
COUNT=0def perm(n,begin,end):    global COUNT    if begin>=end:        print n        COUNT +=1    else:        i=begin        for num in range(begin,end):            n[num],n[i]=n[i],n[num]            perm(n,begin+1,end)            n[num],n[i]=n[i],n[num]n=[1,2,3,4]perm(n,0,len(n))print COUNT

最后输出的结果如下:

======================== RESTART: D:/Python27/perm.py ========================
[1, 2, 3, 4]
[1, 2, 4, 3]
[1, 3, 2, 4]
[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 2, 3]
[2, 1, 3, 4]
[2, 1, 4, 3]
[2, 3, 1, 4]
[2, 3, 4, 1]
[2, 4, 3, 1]
[2, 4, 1, 3]
[3, 2, 1, 4]
[3, 2, 4, 1]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 4, 1, 2]
[3, 4, 2, 1]
[4, 2, 3, 1]
[4, 2, 1, 3]
[4, 3, 2, 1]
[4, 3, 1, 2]
[4, 1, 3, 2]
[4, 1, 2, 3]
24
>>> 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148493.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • win10无法安装华为电脑管家_非华为电脑怎么下载华为电脑管家

    win10无法安装华为电脑管家_非华为电脑怎么下载华为电脑管家一、准备内容①华为电脑下载华为电脑管家

    2022年8月13日
    10
  • 时间复杂度是什么_时间复杂度的表示方法

    时间复杂度是什么_时间复杂度的表示方法-宝宝为啥听不懂他们在讨论的时间复杂度0.0-我怎么知道这个算法运行得比那个算法快0.0-我究竟会不会超时0.0-我为什么还会超时0.0-时间复杂度怎么算0.0在别人还不会求时间复杂度的时候而你会了是不是很酷在别人都会求时间复杂度的时候而你不会是不是很尴尬千里之行始于足下希望这篇文章能祝你一臂之力=w= 此篇详解,希望能帮助各位稍微解决一下不解=w=…

    2025年6月6日
    2
  • Java中Scanner的理解大总结「建议收藏」

    Java中Scanner的理解大总结「建议收藏」Scanner类常用的方法:Scnaner(Filefile);Scnaner(Stringfilename);创建一个从特定文件扫描的扫描器hasNext();还有可读取的书库返回truenext();返回下一个标志作为字符串nextLine();使用行分隔符从这个扫描器返回一个行结束nextByte();nextshort();nextInt();nextLong()

    2022年7月20日
    18
  • idea2021激活码在线生成[免费获取]

    (idea2021激活码在线生成)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~ML…

    2022年3月20日
    162
  • 究竟什么是Java虚拟机(JVM)?

    究竟什么是Java虚拟机(JVM)?我们都知道,在Windows上,软件包后缀有exe,而苹果的MacOSX系统上没有安装exe。类似地,MacOSX系统上的软件安装包是dmg后缀,不能安装在Windows系统上。为什么不能安装不同系统上的软件,因为操作系统的底层实现是不同的。对于Windows系统,exe后缀的软件代码被编译成能被Windows系统识别的机器代码。对于MacOSX系统,最后将DMG后缀的软件代码编译为M…

    2022年7月8日
    17
  • 报错注入学习[通俗易懂]

    报错注入学习[通俗易懂]复习完sqlilabs1-4关熟悉了简单sql注入的payload,不用反复看wp的payload,学到了可以0x5c:/%23:#%20:(空格)0x7e=~-1′)unionselect1,(selectgroup_concat(username,0x5c,password)fromusers),3%23遇到第五关报错注入学习文章1学习文章2学习笔记:报错注入原理:报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出…

    2022年9月29日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号