递归生成全排

对n个元素进行全排,可以归结到他的下一级:

    1,拿出第1个元素放在最全面,将后面的n-1个元素全排,然后将第1个元素归到开始位置

    2.拿出第2个元素放在最全面,将后面的n-1个元素全排,然后将第2个元素归到开始位置

…………………………

    n,拿出第n个元素放在最全面,将后面的n-1个元素全排,然后将第n个元素归到开始位置

比如生成abc的所有排列:
拿出a,于是可以abc 和acb

拿出b,于是可以bca和bac

拿出c,于是可以cab和cba

#include<iostream>
#include<algorithm>/*包含了交换函数*/
using namespace std;
void permutation(char*p,int i,int j);
int main(){
char ch[100];
cin >> ch;
permutation(ch, 0,strlen(ch)-1);
return 0;
}
void permutation(char p[], int i, int j){
static int count = 0; /*count用来记录全排次数*/
int k;
if (i == j){
/*如果只有一个元素那摩排列就是本身,说明此次的一个全排生成*/
count++;
cout << "Case " << count << ":";
for (k = 0; k <= j; k++)
cout << p[k]; /*输出一个全排*/
cout << endl;
}
else /*否则在p[i:j]中有多个全排*/
for (k=i;k<=j; k++){
swap(p[i], p[k]); //交换位置,将第k个数提前
permutation(p, i+ 1, j); //递归调用
swap(p[i], p[k]); //将位置还原
}
}

原文地址:https://www.cnblogs.com/td15980891505/p/4439974.html