算法递归——集合的全排列问题

集合全排列问题

设集合 R={ r1,r2,r3 … r n},显然全排列的数目为 n!。
那么如何显示集合的所有全排列呢?
可以用递归的方式实现。

解题思路
如果集合有n个元素,那么就可以看作 n-1个元素全排列之后再加上 剩下的那个元素,因为是全排列,所以每一个元素都会剩下一次。(例如:
R={1,2,3}的全排列。
若 1 剩下,则 {2,3} 先进行排列,再与1结合,结果是 1 23,1 32。
若 2 剩下,则{1, 3}排列,与2结合,结果是 2 13, 2 31。
若 3,结果为 3 12 , 321。)

继续,n-1 个数的全排列又可以看作 n-2 个数的全排列,再与剩下的那个数结合。这就与刚刚的操作重复了,一层层的往下简化,直到最后,数列中只剩下了1个元素,递归就结束了。

来看具体实现

//定义一个数组,表示集合
//参数k为起始排列数的下标,m为结束下标。
void Perm(int list[], int k, int m)	
{
	if(k==m) 			//递归结束标志,起始下标=结束下标,代表集合内就一个数了。
	{
		for(int i=0;i<=m;i++)		
			cout<<list[i]<<" ";	//此时数组内的元素已经被交换好位置,一种排列可以输出。
		cout<<e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值