递归输出序列的全排列
1. 一个数的全排列就是本身
2.首先看最后两个数4, 5。它们的全排列为4 5和5 4, 即以4开头4和自己交换的5的全排列和4和5交换以5开头的4的全排列。
3.再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。即以3开头的和4,5的全排列的组合、3和4交换以4开头的和3,5的全排列的组合和3和5交换以5开头的和3,4的全排列的组合.
求全排列
void FullArray(char* array, int array_size, unsigned int index)// index子全排列的起点
{
if(index>= array_size)
{
for(unsignedint i = 0; i < array_size; ++i)
{
cout<< array[i] << ' ';
}
cout<< '\n';
return;
}
for(unsignedint i = index; i < array_size; ++i)
{
swap(array,i, index);
FullArray(array,array_size, index + 1);
swap(array,i, index);
}
}
http://blog.sina.com.cn/s/blog_662234020101azp7.html
首先假设有 ABCDEF这6个字符的字符串S,现在要找出3个字符的所有组合;
思路如下:
首先我们找到这个字符组合中一定包含A字符的组合,那么A字符肯定就定下来了,即包含S中第一个字符的组合,然后以剩下的字符串BCDEF作为新的字符串,找出所有的2个字符的组合,那就得到了A包含的所有组合了是吧。。
然后我们就可以省去A了,因为包含A的所有的组合都找到了,所以我们又开始以BCDEF这个字符串找出所有的3个字符的组合;
那么做法和上面一样,又以第一个为指定的字符,CDEF进行找出所有2个字符的组合。这样包含B开头的所有字符组合也找完了吧‘
依次遍历下去,达到E的时候,不能再进行了,因为剩余长度小于3个了。
以上就是我们的方法;
当然找2个字符组合的也是利用上面的方法递归进行。
那么就这样就OK了;
void combine(char *source,char *result,int n)
{
int len=strlen(source);
if(n==0)//找到n个的时候,输出结果
{
printf("%s\n",result);
}
else
{
int i;
int j;
for(j=0;*(result+j)!='\0';j++);//j目的是为了当前第n轮的字符插入到result的末尾,即算出末尾的那个位置
for(i=0;i<len;i++)//确保source不会越界
{
*(result+j)=*source;//设置result
*(result+j+1)='\0'; //为result的下一个设置结束符合,否则下一轮的j会有错;
source++; //为这一轮的起始位置往后移动一个位置。
combine(source,result,n-1); //以下一个位置作为N-1轮的起始位置。
}
}
}