递归求解全排列问题
求解思想:
排列中每一个数字,都有一次当最前单一缀的机会,
例如: 排列数组 a[]
1.当a[]中只有1个数字的时候,(a[1]={a1})则只有1个数字做单一前缀和后缀,则只有一种(1!=1)可能 a1,直接输出
2.当a[]中只有2个数字的时候,(a[2]={a1,a2}) ,则a1,a2分别有一次机会做单一前缀的机会,(2!=2) ,{a1 ,a2} {a2,a1}
3,当a[]中有3个数字时候,(a[3]={a1,a2,a3}) ,3个数字分别有一次做前缀的机会,则固定一个数字做前缀有3中情况(a1..... a2........ a3........) ,后面2个数字如同情况2.
故有3!=6中排列。
4.当a[]的数字数目大于2情况都如同情况3 。
代码见下:
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int temp ;
temp=a;
a=b;
b=temp;
}
void show(int a[],int n) //显示全部数组
{
for(int i=0;i<n;i++ )
{
cout<<a[i]<<" ";
}
cout<<endl;
}
void prim(int a[],int k, int n) //n是这个a[]中有多少个元素 ,k是a[]需要全排列的的坐下标
{
if(k==n-1)//不是只有一个元素 而是全排列到最后一个数字时 终止递归的条件
{
show(a,n);
}
else
{
for(int i=k;i<n;i++) //从k开始时保证交换和递归次数
{
swap(a[i],a[k]); //第一次 自己和自己交换即自己是最前单一前缀 交换单一前缀和后缀中的每一个元素 ,让每一个元素都可以做前缀
prim(a,k+1,n);
swap(a[i],a[k]); //回溯之后 仍然恢复交换以前的顺序
}
}
}
int main(int argc, char* argv[])
{
int a[3]={1,2,3};
prim(a,0,3);
system("PAUSE");
return 0;
}
![](https://img-my.csdn.net/uploads/201302/18/1361184040_5914.png)