递归生成集合的全排列

题目描述

递归,生成集合的全排列,也是在笔试面试中经常考的问题。全排列问题一般要求递归或非递归的解决,非递归按序输出集合的全排列在我的另一篇博客中有介绍(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);
}


小结

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值