排列生成——递归

对于给定的n>=1的集合,需要打印出该集合所有可能的排列。例如,如果这个集合是{a,b,c},那么所有可能得排列是:

1. a b c

2. a c b

3. b c a

4. b a c

5. c a b

6. c b a

即 a 加上{b,c}的所有排列

     b 加上{a,c}的所有排列

     c 加上{a,b}的所有排列

那么依次类推当 n  = 4时{a,b,c,d}排列的就是(只用 a 来说吧,其他同理): 

  a 加上{b,c,d}的所有排列,

而{b,c,d}的所有排列又可分为(拿b举例,c,d同理):

b 加上 {c,d}的所有排列,

而{c,d}的排列就两种,即{c,d}和{d,c}

所以只要是元素个数是 n>=1 个的集合,都可以用递归的方法一层一层的简化,直至简化至 2 个元素为止(n = 1 除外)

下一步就是交换最后的这 2 个元素,然后再逐级往上加就可以得到该集合所有的不同排列

以下是集合{1,2,3,4}的举例代码:

#include<iostream>
using namespace std;
void Perm(int a[],int k,int n)   // k 从 1 开始,n 为元素的个数
{
	if(k==n) //输出排列 
	{
		for(int i=0;i<n;i++)
			cout<<a[i]<<" ";
		cout<<endl;
	}
	else    //递归生成这些排列 
	{
		for(int i=k-1;i<n;i++)
		{
			int t = a[i];
			a[i] = a[k];
			a[k] = t;
			Perm(a,k+1,n);
			t = a[k];
			a[k] = a[i];
			a[i] = t;
		}
	}
}
int main()
{
	int a[4] = {1,2,3,4};
	Perm(a,1,4);
} 
int 也可以换成其他类型

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是土豆大叔啊!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值