给定一个字符串,递归输出它的全排列
例如:给定一个字符串abcd,我们该如何去书写它的一个全排列?
为了有规律地进行书写,我们一般是先保持第一个a不动,写后面bcd这3个的全排列,
如:bcd的全排列为 bcd bdc bdcbdc bdc bdc
这样的书写方式看起来非常地有规律,易于理解
在用a连接上bcd的全排列,得到的就是a开头产生的全排列
a的全排列 |
---|
abcd |
abdc |
abdc |
abdc |
abdc |
abdc |
之后再让b到第一个位置,即可以产生b开头的全排列,之后让其中的每一个都到开头的位置即可产生全部的全排列
具体实现的代码如下:
#include<stdio.h>
void swap(char* a, char* b) {
char temp = *a;
*a = *b;
*b = temp;
}
void AllRange(char A[], int i, int k) {
//当i到末尾的时候可以直接进行输出
if (i == k) {
printf("%s\n", A);
}
else {
//进行for循环产生后面的式子
for (int j = i; j <= k; j++) {
//进行交换,更换全排列前面的值
swap(A + i, A + j);
//递归产生全排列后面的值
AllRange(A, i + 1, k);
//重新进行交换,使全排列有序
swap(A + i, A + j);
}
}
}
void main() {
char A[] = { '0', '1', '2', '3', '\0' };
AllRange(A, 0, 3);
}
对0123这四个的全排列的输出结果如下:
0123
0132
0213
0231
0321
0312
1023
1032
1203
1230
1320
1302
2103
2130
2013
2031
2301
2310
3120
3102
3210
3201
3021
3012
一共有4!种结果