对于给定的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 也可以换成其他类型
新闻热点
疑难解答