【木有人?】递归全排列问题
程序代码:#include"stdio.h"
#define SWAP(a,b,c) ((c)=(a),(a)=(b),(b)=(c))
void perm(int *list,int i,int n);
int main()
{
int arry[4]={1,2,3,4};
perm(arry,0,3);
return 0;
}
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("\n");
}
else
{
for(j=i;j<=n;j++){
SWAP(list[i],list[j],temp);
perm(list,i+1,n);
SWAP(list[i],list[j],temp);
}
}
}
当递归与循环在一起的时候,我就晕了!有人能解释下这个算法吗?还有个问题,递归到了终止条件之后是怎么样返回的?
木有人回答?那我先分析一下!
首先,排列要得到1,2,3,4的全排列,只需要先以1开头,把2,3,4全排列,要把2,3,4进行全排列,只需要以2开头,全排列3,4,对3,4进行全排列,则以3开头,对4全排列
2 1,3,4 3 2,4 4 3
3 1,2,4 4 2,3
4 1,2,3
在上面,蓝色部分就是利用递归,紫红色部分就是利用循环
那就先以1开头进行递归求出以1开头的全排列 分析
for(j=0;j<=3;j++) i=0 <--------第一次调用perm
交换list[0],list[0] | list[0],list[1] | list[0],list[2] | list[0],list[3]
for(j=1;j<=3;j++) i=1 <------第二次调用
交换list[1],list[1] | list[1],list[2] | list[1],list[3]
for(j=2;j<=3;j++) i=2 <----第三次调用
交换list[2],list[2] | list[2],list[3]
for(j=3;j<=3;j++) i=3 <-----满足递归终止条件i=n=3
交换list[3],list[3] <-----输出:1 2 3 4 返回上一级函数 请问返回上一级函数,上一级函数所执行的操作!
希望没有分析错误吧!

[ 本帖最后由 liangjinchao 于 2011-5-9 22:50 编辑 ]










好难懂
