【木有人?】递归全排列问题
程序代码:
#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 编辑 ]