perm(list,i,j)是一个全排列函数,拿你上面的列子来说:
perm(list,0,5)意思是数组list的前6个数(第0个数到第5个数)的所有排列,它细分的话就等于:第0个数和第1个数互换以后的perm(list,1,5) 第0数和第2数互换perm(list,1,5) ....第0数和第5数互换的perm(list,1,5) 和它本身的所在0位置的perm(list, 1, 5)
如假如6个数是1 2 3 4 5 6
他们的排列就 * * * * * * perm(list,0,5)
1 * * * * * perm(list,1,5)
2 * * * * * perm(list,1,5)
3 * * * * * perm(list,1,5)
4 * * * * * perm(list,1,5)
5 * * * * * perm(list,1,5)
6 * * * * * perm(list,1,5) 就是每一个数都在第0个位置上面都出现一次以后的排列总和。 也就是它的for循环的意思
这只是形象的比喻一下
总共n个数,现在填第i个
void perm(int list[],int i,int n)
{
int j,temp;
if(i==n) //全部填充完毕时则输出一个结果
{
for(j=0;j<=n;j++)
{
printf("%d ",list[j]);
}
printf(" ");
}
else
{
for(j=i;j<=n;j++) //第i个数有n-i+1种填法,list[0]到list[i-1]已经填好了,不能重复使用,所以循环变量j从i开始,任意选择后面的没用过的一个数字来填充当前位置
{
SWAP(list[i],list[j],temp); //填充当前位置
perm(list,i+1,n); //填充第i+1个数字
SWAP(list[i],list[j],temp); //恢复原来的数据,不然后面的填充会产生重复的排列
}
}
}
Perm(list,k,m)递归的产生所有后缀是list(0:k-1),且后缀是
list(k:m)的全排列的所有排列。