递归生成集合的全排列

来源:互联网 发布:赛尔号刷米币软件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);}


小结

利用递归与非递归生产集合的全排列,是考察基本功的小算法,需要理解其思想,熟练掌握解题方法。