首页 > 学院 > 开发设计 > 正文

排列生成——递归

2019-11-06 06:51:11
字体:
来源:转载
供稿:网友

对于给定的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 也可以换成其他类型


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表