递归全排列 c语言 看不懂

代码如下:
#include<stdio.h>
#include<math.h>
#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
#define MAX_SIZE 101
void perm(int [],int,int);
main()
{
int i,n;
int list[MAX_SIZE];
printf("Please enter a number:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
list[i]=rand()%100;
printf("%d ",list[i]);
}
printf("\n");
perm(list,0,n-1);
getch();
}

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++)
{
SWAP(list[i],list[j],temp);
perm(list,i+1,n);
SWAP(list[i],list[j],temp);
}
}
}

perm函数中else里的看不懂,最好能说一下它的递归思路。

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循环的意思
这只是形象的比喻一下
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-04-08
总共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); //恢复原来的数据,不然后面的填充会产生重复的排列
}
}
}
第2个回答  2010-04-08
Perm(list,k,m)递归的产生所有后缀是list(0:k-1),且后缀是
list(k:m)的全排列的所有排列。
相似回答