https://blog.csdn.net/axiqia/article/details/50967863 原博客
(一)递归的全排列算法
(A、B、C、D)的全排列为
1、A后面跟(B、C、D)的全排列
2、B后面跟(A、C、D)的全排列(A与B交换,其他次序保持不变)
3、C后面跟(B、A、D)的全排列(A与C交换,其他次序保持不变)
4、D后面跟(B、C、A)的全排列(A与D交换,其他次序保持不变)
用数字举例方便点:
1234
1243
1324
1342
1432
1423
2134
....
3214
3214
3241
3124
3142
3412
3421
4231
为观察规律,仅仅标红1234全排列中最高位首次1,2,3,4的排列。
解释:
以1234为基础(代码中第二次交换的意义),同为第一层递归的4种状态分别为:
第一位和第一位交换(1234==》1234);
第一位和第二位交换(1234==》2134);
第一位和第三位交换(1234==》3214);
第一位和第四位交换(1234==》4123)。
为保证普遍性,选第三种状态继续递归:
以3214为基础,同为第二层递归的三种状态分别为:
第二位和第二位交换(3214==》3214);
第二位和第三位交换(3214==》3124);
第二位和第四位交换(3214==》3412)。
继续递归即可。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 void permutation(int k, int n, int a[]) 6 { 7 //递归到底层 8 if(k == n-1) 9 { 10 for(int i = 0; i < n; i ++) 11 printf("%d", a[i]); 12 printf("\n"); 13 } 14 else 15 { 16 for(int i = k; i < n; i ++) 17 { 18 int temp = a[k]; 19 a[k] = a[i]; 20 a[i] = temp; 21 22 //交换后递归下一层 23 permutation(k+1, n, a); 24 25 //保证每一层递归后保持上一层的顺序 26 temp = a[k]; 27 a[k] = a[i]; 28 a[i] = temp; 29 } 30 } 31 } 32 int main() 33 { 34 int a[100]; 35 int n; 36 scanf("%d", &n); 37 38 for(int i = 0; i < n; i ++) 39 a[i] = i+1; 40 41 permutation(0, n, a); 42 return 0; 43 }
不过输出的格式有点偏差
12345 12354 12435 12453 12543 12534 13245 13254 13425 13452 13542 13524 14325 14352 14235 14253 14523 14532 15342 15324 15432 15423 15243 15234 21345 21354 21435 21453 21543 21534 23145 23154 23415 23451 23541 23514 24315 24351 24135 24153 24513 24531 25341 25314 25431 25413 25143 25134 32145 32154 32415 32451 32541 32514 31245 31254 31425 31452 31542 31524 34125 34152 34215 34251 34521 34512 35142 35124 35412 35421 35241 35214 42315 42351 42135 42153 42513 42531 43215 43251 43125 43152 43512 43521 41325 41352 41235 41253 41523 41532 45312 45321 45132 45123 45213 45231 52341 52314 52431 52413 52143 52134 53241 53214 53421 53412 53142 53124 54321 54312 54231 54213 54123 54132 51342 51324 51432 51423 51243 51234