递归生成集合的全排列
来源:互联网 发布:赛尔号刷米币软件2016 编辑:程序博客网 时间:2024/05/19 21:41
题目描述
递归,生成集合的全排列,也是在笔试面试中经常考的问题。全排列问题一般要求递归或非递归的解决,非递归按序输出集合的全排列在我的另一篇博客中有介绍(http://blog.csdn.net/syzcch/article/details/8136218),这里主要介绍递归生成集合全排列的方法。
递归思路
递归的解这道题的方法相对于非递归的解法来说较为简单,用一个例子即可说明:
假设集合元素为{1,2},那么初始序列就是1 2,经过1与2交换得到2 1,两个序列生成完毕。
若集合元素为{1,2,3},那么初始序列为1 2 3,那么将2和3换位后,生成一个序列1 3 2。
再回到初始序列1 2 3,将2和1换位,得到序列2 1 3,然后再将1和3换位,则得到另一个序列2 3 1。
再次回到初始序列1 2 3,这次将3和1换位,得到序列3 2 1,然后将2和1再换位,得到另一个序列3 1 2。
这样,从集合{1,2,3},派生出了集合:1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
生产了该集合能产生的所有排列,也就完成了本题目的需求。
上面的思路很容易理解,而且也很容易看出利用递归求解是很方便的,下面是具体的示例代码。
示例代码
void quansort(char *src,char *begin){char *pc;if('\0'==*begin){printf(" %s ",src);return;}for(pc=begin;*pc!='\0';pc++){char tmp;tmp=*pc;*pc=*begin;*begin=tmp;quansort(src,begin+1);tmp=*pc;*pc=*begin;*begin=tmp;}}
void main(){char p[4]="abc";quansort(p,p);}
小结
利用递归与非递归生产集合的全排列,是考察基本功的小算法,需要理解其思想,熟练掌握解题方法。
- 递归生成集合的全排列
- 递归生成全排列
- 递归实现集合全排列
- 递归函数生成全排列
- 递归函数应用举例(集合元素的全排列)
- 非递归,按序输出集合的全排列
- 非递归,按序输出集合的全排列
- 集合的全排列问题-递归实现方法
- 全排列生成 (递归+非递归)
- 集合的全排列
- 简单探讨全排列的递归生成算法
- 全排列的生成
- 全排列的生成
- 全排列的生成
- 递归生成全排列(常规)
- 递归解决全排列生成算法
- 全排列生成算法(非递归)
- 递归解决全排列生成算法
- Ruby哈希表基本操作
- hudson出现E200015: authentication cancelled
- 32bit程序在64bit操作系统下处理重定向细节
- 中间件小结——几个概念
- 在windows下下载安装memcached
- 递归生成集合的全排列
- 怎样查看rpm安装包的安装路径
- [转载]VC++数据类型
- Range对象基本操作应用示例(2)
- Linux用户空间与内核空间
- 十个js炫图效果
- 在调用对象属性的时候。请先保证对象不为空
- Maven 手动添加 JAR 包到本地仓库
- MySQL substring()用法及其他截取字段方式