设计一个递归算法求n个不同字符的所有全排列:例如
123:
123,132,213,231,312,321
要点:
1.n个元素的排列=(n-1)的排列+剩下元素作为前缀;
2.如果只有一个元素的全排列,说明已经排列好,可以输出排列结果;
3.不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;
而要得到(n-1)个数的全排列就必须得到(n-2)个数的全排列,,,最后得到一个数的全排列就是其本身,这也是递归的出口
void getarr1(char str[],int k,int n){
int i;
char t;
if(k==n-1){
for(i=0;i<n;i++)
printf("%c",str[i]);
printf("\n");}//前n-1个数排列已经确定,递归到只有一个数
else {
for(i=k;i<n;i++)
{t=str[k];
str[k]=str[i];
str[i]=t;
getarr(str,k+1,n);
t=str[i];
str[i]=str[k];
str[k]=t;}
}
}
类似地,
void getarr(char str[],int k,int n){
int i;
char t;
if(k==0){
for(i=0;i<n;i++)
printf("%c",str[i]);
printf("\n");}//只有一个元素的全排列
else {
for(i=0;i<=k;i++)
{t=str[k];
str[k]=str[i];
str[i]=t;
getarr(str,k-1,n);
t=str[i];
str[i]=str[k];
str[k]=t;}
}}