Python递归生成全排列序列实操

目录
  • 前言
  • 代码
  • 测试结果

前言

  • 在生成数据的过程中,我们有时候需要基于已有的数据生成排列组合的序列,对此,我们需要编写全排列算法生成序列,本文将分享本人编写的递归实现的全排列算法,支持对任意类型的数据进行生成全排列序列(不局限于数字)
  • 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
  • 全排列数: f(n)=n!(定义0!=1)f(n)=n!(定义0!=1)
  • 递归实现方法:
    • 要求长度为n的序列的全排列序列:
    • ①依次选取原始序列一个元素作为全排列序列结果的第一个元素
    • ②递归调用全排列算法生成剩余n-1个元素的所有全排列序列
    • ③将①的元素分别与②的每一个序列组合,即可得到长度为n的序列所有全排列序列
    • ④递归结束条件:长度n=2的序列seq的有两个全排列序列为[seq[0],seq[1]]和 [seq[1],seq[0]]

代码

  • 输入:长度为n的序列,元素可以任何类型
  • 输出:输入序列的所有全排列序列
def full_sort(seq: list):
    '''
    author: 浅若清风cyf
    date: 2022/03/17
    全排列算法(递归)
    :param seq: 原始序列
    :return:
    '''
    results = []
    if len(seq) == 1:
        return seq
    elif len(seq) == 2:  # 递归返回终点
        return [[seq[0], seq[1]], [seq[1], seq[0]]]
    else:
        for i in seq:
            sub_seq = seq.copy()  # list类型为引用传递,此处需要使用copy()创建一个副本,避免修改原始list
            sub_seq.remove(i)
            tmp_result = full_sort(sub_seq)  # 获取子列表的全排列
            for t in tmp_result:
                results.append([i] + t)
        return results

测试结果

  • 测试样例1
if __name__ == '__main__':
    res = full_sort([1, 2, 3, 4])
    n = 0
    for i in res:
        print(i, end=' ')
        n += 1
        if n % 5 == 0:
            n = n % 5
            print('')

  • 测试样例2
    res = full_sort(['Apple', 'XiaoMi', 'HuaWei', 'OPPO'])
    n = 0
    for i in res:
        print(i, end=' ')
        n += 1
        if n % 5 == 0:
            n = n % 5
            print('')

到此这篇关于Python递归生成全排列序列实操的文章就介绍到这了,更多相关Python生成全排列序列内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python递归全排列实现方法

    本文实例为大家分享了python递归全排列的实现方法,供大家参考,具体内容如下 排列:从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} 则全排列就是

  • python非递归全排列实现方法

    刚刚开始学习python,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位置插入,生成n+1个新的全排列.因为Python切割数组或者字符串,以及合并比较方便,所以,程序会节省很多代码. def getArrayInsertCharToStr(STR,CHAR): arr =[] s_len = len(STR) index =0 while index <= s_len: #分割字符串 ar

  • python使用递归解决全排列数字示例

    第一种方法:递归 复制代码 代码如下: def perms(elements):    if len(elements) <=1:        yield elements    else:        for perm in perms(elements[1:]):            for i in range(len(elements)):                yield perm[:i] + elements[0:1] + perm[i:] for item in li

  • Python递归生成全排列序列实操

    目录 前言 代码 测试结果 前言 在生成数据的过程中,我们有时候需要基于已有的数据生成排列组合的序列,对此,我们需要编写全排列算法生成序列,本文将分享本人编写的递归实现的全排列算法,支持对任意类型的数据进行生成全排列序列(不局限于数字) 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 全排列数: f(n)=n!(定义0!=1)f(n)=n!(定义0!=1) 递归实现方法: 要求长度为n的序列

  • Python中Qslider控件实操详解

    在学习一些pyqt5的内容后,我们对于其中的组件也有所接触.本篇所要带来的是Qslider控件,也可以说是python中比较常见的控件了.在一些具体的使用和方向等相关的操作上,很多人是没有全面的进行过系统学习的.下面我们就这些操作逐个为大家带来介绍,一起来看下Qslider控件的使用吧. 1.控件介绍和使用 qslider解释为滑块控件,用于方便左右滑动. 往往这类滑动更多用于屏幕可以触碰的设备. 我们想要使用滑块控件,本质上实则就是调用Qslider类. 使用的时候,首先对qslider这个类

  • python程序变成软件的实操方法

    本人新学python,发现python程序转成软件好麻烦,为了方便大家,同时自己整理下资源,发布以下教程哦. 下载 "pywin32"软件,选择最新的build文件夹,支持新版本的python 下载完毕后进行安装,需要相应版本的python作为支持 安装完成后,打开cmd,输入"pip install pywin32",如果pywin32程序老旧,会提示你输入 "python -m pip install --upgrade pip"命令自动更新

  • python实现键盘输入的实操方法

    python中有指定的代码进行输入操作,所以今天就由小编来为大家介绍python怎么实现键盘输入. 第一首先打开电脑的python编辑工具. 再创建python项目. 第二然后应用sys函数. 命令为import sys. 第三然后定义一个int类型的x. 再用函数进行接收键盘的输入. 第四然后用sys.stdin.readline方法. 再读取x的数值. 第五然后进行输出x的数值. 再用print函数进行输出. 第六然后右键点击python项目. 再点击运行项目. 这样就实现python的键盘

  • python中嵌套函数的实操步骤

    在python中如何嵌套函数? 首先打开python编辑器并且写上注释的内容. 然后定义一个函数addstr 在addstr函数里面写上内容,内容是写入文件内容. 新建第二个函数diaoyong 在函数里面嵌套刚才创建的addstr函数. 最后在函数外面调用函数. 最后运行这个程序.

  • Python生成一个迭代器的实操方法

    Python怎么生成一个迭代器,对于需要处理大型数据来说,迭代器是必不可少的,这样可节省大量内存空间,更加合理操作数据. 首先我们打开编辑器,这里以Sublime text3作为示范,创建一个新的py文档. rg = range(100) for i in rg: print(i) 我们知道range可以涵盖比较广的范围,但是如果数据太大的时候,一次性打印会占用比较多内存. rg = range(100) rg_iter = iter(rg) print(rg_iter) 那么这个时候我们就可以

  • python学习实操案例(四)

    目录 任务1.“千年虫”我来了 函数enumerate 排序之后的 任务2.京东购物流程 入库操作 整个过程 下面要学的是列表: 任务1.“千年虫”我来了 函数enumerate enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. year=[82,89,88,86,85,00,99] print('原列表:',year) for index,value in enumerate(year):  

  • python学习实操案例(三)

    目录 任务1.循环输出26个字母对应的ASCII码值 任务2.模拟用户登录 任务3.猜数游戏 任务4.计算100-999之间的水仙花数 任务1.循环输出26个字母对应的ASCII码值 x=97#代表的是a的ASCII值 for _ in range(1,27):     print(chr(x),'----->',x)     x+=1 print('--------------------------------------') x=97 while x<123:     print(chr

  • python函数超时自动退出的实操方法

    本章给大家在项目使用时候,常见的一种情况解决案例,即是当我们调用多个线程,使用了同一个函数去处理数据的时候,有些用函数已经处理完成,但是有些还没有,这就需要我们将任务进行分割,然后当一小部分任务执行后,退出来,另外没有执行的完成超时的就继续去执行,下面就针对遇到这些问题的小伙伴,给大家提供解决参考. 安装timeout-decorator库: pip3 install timeout-decorator 编写异常语句: @timeout_decorator.timeout(5, timeout_

随机推荐