生成全排列的最简单的递归方法的思想:
1.可以把几个数字分成前半部和最后一位。
对于0123这四个数来说,最后一位(红色字体)所出现的情况只有以下四类(先不管前三个数的排列组合情况):
* | * | * | 3 |
* | * | * | 2 |
* | * | * | 1 |
* | * | * | 0 |
这样我们就把四个数字的排列问题,变成了3个(对于上述的每一行来说)。
2.终结条件是1个数字的排列就是其本身。
直接看一个用递归方法得到的结果和只看最后一位的分类情况:
几个可能遇到的疑问:
Q:为什么要分成前半部和最后一位?
A:这个是为了编程的方便。你想想,数组的指针在第一位。如果你规定第一位和后半部。数组的指针就要移动。
Q:什么时候输出?
A:当你判断到一个数字的排列问题的时候。因为除了这个数字的其他数字位置已经固定了,这实际上就生成了一个全排列。
Q:某一位的数字怎么确定?
A:如果分成前半部和最后一位,则将左边的每一位和当前位交换。
源代码(vs 2010):
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int array[] = {0,1,2,3};
int num = 4;
void swap(int *parr,int a,int b)
{
int c;
c=parr[a];
parr[a]=parr[b];
parr[b] = c;
}
void pt(int *parr,int n)
{
if(n==1){
for (int i=0;i<num;i++)
{
printf("%d ",parr[i]);
}
printf("\n");
return;
}
for (int i=0;i<n;i++)
{
swap(parr,n-1-i,n-1);
pt(parr,n-1);
swap(parr,n-1-i,n-1);
}
}
int main()
{
pt(array,num);
system("pause");
}