题目描述
递归,生成集合的全排列,也是在笔试面试中经常考的问题。全排列问题一般要求递归或非递归的解决,非递归按序输出集合的全排列在我的另一篇博客中有介绍(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);
}
小结
利用递归与非递归生产集合的全排列,是考察基本功的小算法,需要理解其思想,熟练掌握解题方法。