递归 求全排列与全组合
我在百度,触宝面试的时候,他们都问到了递归。
递归是一个很有意思的问题,其中的经典问题有汉诺塔,fibonacci 数列问题。汉诺塔是比较难的问题,fibonacci 是比较简单的问题。
触宝面试的时候,面试官问我如何对一个数组进行全排列。全排列的意思是,给定一个数组[1,2,3],列出它所有可能的排列方式:[1,2,3],[1,3,2],[2,3,1],[2,1,3],[3,1,2],[3,2,1]共6种。面试官就提示我可以用递归来做。
我们看一下人脑思维针对全排列所给出的排列方式:
数组为[1,2,3]时,步骤如下:
1放第一位,然后全排列数组[2,3],得到[1,2,3],[1,3,2]
2放第一位,然后全排列数组[1,3],得到[2,1,3],[2,3,1]
3放第一位,然后全排列数组[1,2],得到[3,1,2],[3,2,1]
数组为[1,2]时,排列有两种:[1,2],[2,1]。排列步骤如下:
1放第一位,然后全排列数组[2],得到[1,2]
2放第一位,然后全排列数组[1],得到[2,1]
数组为[1]时, 排列方式只有一种:[1]
可以看到当前问题都会基于上一个小问题的解决。这就可以用到递归的方法。
全排列的递归代码如下:
COUNT=0
def perm(n,begin,end):global COUNTif begin>=end:print nCOUNT +=1else:i=beginfor 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
求了全排列之后,我们用递归的方法求一下全组合。
全组合也可以看作是求一个集合的所有子集。
例子,{1,2,3}的所有子集就是{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}以及空集合{}。
组合排列,排列组合。
def PowerSetsRecursive(items):"""Use recursive call to return all subsets of items, include empty set"""if len(items) == 0:#if the list is empty, return the empty listreturn [[]]subsets = []first_elt = items[0] #first elementrest_list = items[1:]#Strategy:Get all subsets of rest_list; for each of those subsets, a full subset list#will contain both the original subset as well as a version of the sebset that contains the first_eltfor partial_sebset in PowerSetsRecursive(rest_list):subsets.append(partial_sebset)next_subset = partial_sebset[:] +[first_elt]subsets.append(next_subset)return subsetsitems = [1,2,3,4]
print PowerSetsRecursive(items)
运行结果:
[[], [1], [2], [2, 1], [3], [3, 1], [3, 2], [3, 2, 1], [4], [4, 1], [4, 2], [4, 2, 1], [4, 3], [4, 3, 1], [4, 3, 2], [4, 3, 2, 1]]
递归 求全排列与全组合相关推荐
- Java递归求全排列详解
Java递归求全排列详解 推荐博客: 博客园Java全排列递归算法,结尾的解释很形象了 csdn的大佬写的,和我下面的代码思路基本一致 全排列的递归思想解释: 全排列的数学定义就不再过多解释,考虑递归 ...
- 递归求全排列的学习与理解
递归求全排列 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 例题: 输出自然数 1 到n所有 ...
- 不使用递归求全排列和组合数
同学遇到的面试问题,大意是M台机器放在N个房间,不使用递归求打印所有情况 解题思路:情况共计N**M种.开始想将所有情况放入数组,填充好数组再逐个打印.随后发现按照填充的思路,不使用大数组也可以实现. ...
- C++ STL求全排列和组合
C++11 STL内置了求全排列的模板函数next_permutation和prev_permutation,属于<algorithm>头文件和std命名空间,使用非常方便.例如: vec ...
- 递归实现排列组合问题
在做递归问题时,要保证对递归跳跃的信任,继而对相应的问题寻找其递归实现 (1)组合:先从原始数组中选择一个,再从剩下的集合中选择m-1个:而后,再从剩下的集合中挑选m个元素. /*组合代码(eg:5选 ...
- 背包问题算法实现(全组合、暴力递归、动态规划及空间压缩、对数器)
背包问题的实现 * 1.全组合解法(对数器) * 2.暴力递归解法 * 3.动态规划解法 * 4.动态规划(省空间)解法 对数器的思路是:求解n个物品的全组合中不超过背包容量的组合对应的最大价值(时间 ...
- 排列组合算法(全排列、全组合)
原文链接 http://blog.shuxuemi.cn/web/index/detail/16 // 全排 function fullArrange(&$arr, $index) {if ( ...
- 全排列、全组合 java实现
全排列 所谓全排列就是根据输入字符打印出所有字符的排列方式(分次序).例如输入abc,所有排序的结果有,abc,cba,bac,cab,acb,bca 共6种情况.对于全排列,如果用循环的方法,需要O ...
- 三种求全排列方式之比较
一共有三种求全排列的方式: 第一种就是只适合用于非可重集的DFS实现 第二种就是可以用于可重集上的刘汝佳书上的代码 第三种就是STL中的next--permutation 在对这三种方式做了比较之后发 ...
最新文章
- VTK:几何对象之Cone
- urllib2设置代理
- 词性标注与命名实体识别
- session 和cookie的理解
- centos7 安装 python3.5
- P4070 [SDOI2016]生成魔咒
- easyui的textbox实现编辑保存_第80讲:工作表数据与UserForm窗口的交互,记录的编辑和保存...
- 神奇的机器人评课_《机器人》教学反思
- hightcharts 如何修改legend图例的样式
- iOS popViewController 失败
- 港交所、中芯国际、京东、诺基亚等公司高管变动
- 如何做好Windows2003服务器安全策略
- hustoj安装16种判题语言
- Linux DMA驱动构架分析
- 第11章 角色页的删除、批量删除
- Qt官方示例-QLineEdit编辑器
- 那些诡异的黑客事件 一
- 大连计算机学校贾佳,大连市第二十四中学信息学奥赛喜报频传
- dpdk 内核模块 Unknown symbol in module 问题
- Python中的进程池
热门文章
- Python爬虫爬取新浪新闻内容
- 钉钉机器人智能回复_契约机器人开发教程-新人入群智能回复|良心开发工作室...
- command line/shell/bash
- 【报告分享】2022中国化妆品行业发展趋势洞察-易观分析(附下载)
- c语言脸型图案,终于知道自己是什么脸型了,太实用了!
- jQuery.prototype的含义。
- 最简单的C语言,输出一个“你好,world。”
- Java Web图书管理系统毕业设计
- Scottrade, Firstrade和Sogotrade之对比--到底哪个好?
- 工作站HP电脑系统的重装