现在的位置: 首页 > 综合 > 正文

全排列的递归实现

2012年06月12日 ⁄ 综合 ⁄ 共 634字 ⁄ 字号 评论关闭
全排列的递归实现

1 #include <stdio.h>
2
3 void swap(int *,int *);
4
5 void perm(int *,int,int);
6
7
8
9 void main()
10
11 {
12
13 int list[]={1,2,3,4};
14
15 perm(list,0,3);
16
17 }
18
19 void perm(int *list,int i,int n)
20
21 {
22
23 if(i==n)
24
25 {
26
27 for(int j=0;j<=n;j++)
28
29 {
30
31 printf("%d",list[j]);
32
33 printf(" ");
34
35 }
36
37 printf("\n");
38
39 }
40
41 else
42
43 {
44
45 for(int j=i;j<=n;j++)
46
47 {
48
49 swap(&list[i],&list[j]);
50
51 perm(list,i+1,n);
52
53 swap(&list[j],&list[i]);
54
55 }
56
57 }
58
59 }
60
61
62
63 void swap(int *a,int *b)
64
65 {
66
67 int temp;
68
69 temp=*a;
70
71 *a=*b;
72
73 *b=temp;
74
75 }

 好久才想明白,这个递归还是很麻烦的,相对于一般简单的递归,这里参数较多,另外递归返回的结果不是直接一层层的返回到函数,而是返回到i=n处,返回也不是单向的,每一层递归里面返回几个递归;

最后交换两个值的方法,需用地址交换;
《组合数学》里讲过这个算法

抱歉!评论已关闭.