问题描述:

给定一个包含n个元素的列表,从中选择m个元素作为一个子列表,求解所有可能的子列表。

例如:

一个列表是[1,2,3,4],从中任选3个数作为一个子列表。

则所有可能的子列表为:[1,2,3], [1,2,4], [1,3,4], [2,3,4]。共有

种。

用python语言描述就是:

def getSubLists(lis=[],m=0):

allAns=[]

# type your code here

return allAns

| 输入: [1,2,3,4]

| 输出:[[1,2,3], [1,2,4], [1,3,4], [2,3,4]]

问题分析:

从数学角度来看,从n个数字中任取m个,所有可能的取法总数量为:

。用Python求这个数量结果是很简单的,但是要实际输出所有组合时,却不是易事(对我自己而言)。

就我自己的经验而言,例如从[a,b,c,d,e]中任选3个,我一般会采用如下搜索方式手动去找出所有组合:

这种方法反映了一种递归思想:

选定了原列表种第

个数作为子列表第一个数,接下来就是把原列表第

数作为子列表第二个数,最后从原列表第

个数后面的所有数中任选一个作为子列表第三个数。

也就是说,一旦确定了“谁”作为子列表第一个数,那么接下来采用的方法都是一样的,这不就是递归嘛!

编程实现:

若要采用递归方式,那问题描述中的函数getSubLists不能直接调用自己,因为每次自我调用后,存储结果的allAns会被刷新,所以可以定义辅助函数subLists专门用来做递归:

def getSubLists(lis=[],m=0):

allAns = [] #用来存储所有递归中的子列表

ans = [None for i in range(m)] #预先填充m个None,用来存储每次递归中的子列表

subLists(lis,m,ans,allAns)

return allAns

def subLists(lis=[],m=0,ans=[],allAns=[]):

# recursive function codes

if m==0:

# m==0是某次递归返回的条件之一:子列表的第三个数已经选出。

# 意味着已到达某个方向的最大递归深度

print('allAns is ',allAns,'before append ans:',ans)

allAns.append(ans.copy())

#这里有意思了,如果不用copy,那么ans即使已经存储在allAns,也会被其它递归方向中的ans刷新

print('allAns is ', allAns, 'after append ans:', ans)

return

if len(lis)

# 递归函数直接返回的条件之一:从4个数里面选5个数出来是不可能的。

print("short list!")

return

length=len(lis)

for iter in range(length-m+1): #可以作为子列表一员的数在lis中的index

ans[-m]=lis[iter] #lis[iter]作为子列表倒数第m个数

if iter+1

subLists(lis[iter+1:],m-1,ans,allAns)

else:

print('allAns is ', allAns, 'before append ans:', ans)

allAns.append(ans.copy())

print('allAns is ', allAns, 'after append ans:', ans)

return

好了,是不是挺简单的,来试一下效果:

if __name__=='__main__':

liss=[1,2,3,4]

m=3

print('The answer for choosing any 3 Numbers from the list:',getSubLists(liss,m))

Outputs:

allAns is [] before append ans: [1, 2, 3]

allAns is [[1, 2, 3]] after append ans: [1, 2, 3]

allAns is [[1, 2, 3]] before append ans: [1, 2, 4]

allAns is [[1, 2, 3], [1, 2, 4]] after append ans: [1, 2, 4]

allAns is [[1, 2, 3], [1, 2, 4]] before append ans: [1, 3, 4]

allAns is [[1, 2, 3], [1, 2, 4], [1, 3, 4]] after append ans: [1, 3, 4]

allAns is [[1, 2, 3], [1, 2, 4], [1, 3, 4]] before append ans: [2, 3, 4]

allAns is [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]] after append ans: [2, 3, 4]

The answer for choosing any 3 Numbers from the list: [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]

Bingo! 欢迎指教

python递归排序组合_如何用Python求list的排列组合:一种递归方式相关推荐

  1. 用python处理excel表格_如何用python处理excel数据 | 用python处理excel表格数据类型

    python 读取EXCEL文件中的数据格式 扩展库 xlrd 读excle xlwt 写excle 直上搜就能下载 下载后使用 import xlrd 就可以读excle了 打开文件: xls = ...

  2. python 读取excel图片_如何用Python读取Excel中图片?

    公众号: 早起Python 作者:刘早起 大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进 ...

  3. python可视化迷宫求解_如何用 Python 制作一个迷宫游戏

    相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至耗费数天,然后可能还要分别从入口和出口两头寻找才能找的到通路,甚至也可能找不到通路. 虽然 ...

  4. 怎么用python读取excel图_如何用Python读取Excel中图片?

    公众号: 早起Python 作者:刘早起 大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进 ...

  5. python 矩阵运算 for循环_如何用 Python 科学计算中的矩阵替代循环

    展开全部 因为在Mathematica中使用循环确实是低效的.32313133353236313431303231363533e78988e69d8331333361313961..... 深层次的原 ...

  6. python搭建自动化测试平台_如何用python语言搭建自动化测试环境

    原标题:如何用python语言搭建自动化测试环境 技术分享:基于Python语言的Web自动化测试环境搭建 近期发现很多初学者在学习自动化的过程当中,在环境安装环节总是出现问题,所以详细的出一篇环境搭 ...

  7. 如何制作python检查小软件_如何用Python制作整蛊小程序

    原标题:如何用Python制作整蛊小程序 下面的整蛊程序,千万不要发代码,否则就实现不了你整蛊的目的了.完成后一定要打包成一个exe程序,再发给朋友使用 . 1. 使用 pip install pyi ...

  8. python rest api 测试_如何用Python编写REST API的单元测试

    在过去的几个月中,正在从事一个名为B的项目.它是带有简单Web UI的徽章生成器,用于添加数据并生成PDF可打印徽章.B后端现在已转移到REST-API并测试REST-API中使用的功能,我们需要一些 ...

  9. python的out模式_如何用python中的DataFrame列的模式替换NA值?

    我对Python(和本网站)完全陌生,目前正试图用它们的模式替换特定数据帧列中的NA值.我试过了各种不起作用的方法.请帮我看看我做错了什么:如何用python中的DataFrame列的模式替换NA值? ...

最新文章

  1. 用JavaScript获取URL中的参数值
  2. 七年级计算机教学质量分析,七年级数学期末教学质量分析报告
  3. Git上手:四种常见的Git协同工作方式
  4. Ng第一课:引言(Introduction)
  5. 1.2w星!火爆GitHub的Python学习100天刷爆朋友圈!
  6. mybatis的trim标签
  7. c语言提示少分号,问什么C程序里总是提示缺少分号;,而明明有分号?
  8. 不要让你的不主动,耽误了你的人脉
  9. Visual Studio常用的快捷键
  10. cplex的下载、安装、IDE编程及相关问题解决
  11. Android 简单又炫酷的帧动画(加载动画)
  12. 【机器学习】图解机器学习神器:Scikit-Learn
  13. ELK---日志收集系统
  14. web登录管理系统JAVA_Java Web(九) 用户管理系统
  15. 光纤通信原理实验箱QY-JXSY03
  16. Epicor ERP
  17. 2022年煤气考试试题及答案
  18. 硬件工程师(电源设计)
  19. android 7.0分享朋友圈提示:“获取资源失败,仅支持分享照片至朋友圈”或者FileProvider生成的Uri无法识别
  20. 牛津博士讲大数据和量化金融

热门文章

  1. 最小生成树(普里姆算法【Prim】与克鲁斯卡尔算法【Kruskal】)
  2. What?Java这么神奇的lambda表达式
  3. android 消除标题,Android Activity 去掉标题栏及全屏显示
  4. 幼儿课外活动游戏_幼儿园的户外活动游戏有哪些?
  5. 串口通讯超时的设置与含义(COMMTIMEOUTS)
  6. linux进程网络均衡,linux多CPU进程负载均衡解析
  7. 双击背面截图_ios14怎么轻点双击背面截屏 敲击苹果手机背部截图设置教程
  8. Oracle 11.2.0.4下载地址
  9. 一次高烧期间的感悟……
  10. linux如何在shell中自动生成1到100的数组