您的位置:首页 > 其它

全排列的递归实现

2017-09-23 14:58 211 查看
吃个栗子。

数列:{1,2,3} 第一个与第一个交换

可以得到1 {2,3} 将序列{2,3}放进perm函数递归,然后

——递归{2,3}

数列{2,3}第一个与第一个交换

得到2{3} ,输出1,2,3 (此时low=high,因为序列{3}只有一位数,因此输出列表list)

数列{2,3}第一个与第一个交换回来,结果仍然是{2,3}

数列{2,3}第一个与第二个交换

得到3{2},输出1,3,2

{3,2}又第一个与第二个交换回来,变回{2,3}

——{2,3}递归完毕序列恢复原状{1,2,3}

数列:{1,2,3} 第一个与第二个交换

可以得到2,{1,3}

——递归{1,3}

数列{1,3}第一个与第一个交换

得到1{3} ,输出2,1,3

数列{1,3}第一个与第一个交换回来,结果仍然是{1,3}

数列{1,3}第一个与第二个交换

得到3{1},输出2,3,1

{3,1}又第一个与第二个交换回来,变回{1,3}

—–{1,3}递归完毕

序列{2,1,3}第一个与第二个交换

序列恢复原状{1,2,3}

数列:{1,2,3} 第一个与第三个交换

可以得到3,{1,2}

——递归{1,2}

数列{1,2}第一个与第一个交换

得到1{2} ,输出3,1,2

数列{1,2}第一个与第一个交换回来,结果仍然是{1,2}

数列{1,2}第一个与第二个交换

得到2{1},输出3,2,1

{2,1}又第一个与第二个交换回来,变回{1,2}

—–{1,2}递归完毕

序列{3,1,2}第一个与第二个交换

序列恢复原状{1,2,3}

算法可以简单地写作,其中perm代表全排列函数。

perm({1,2,3})=1perm({2,3})+2perm({1,3})+3perm({1,2})

perm({2,3})=2perm({3})+3perm({2})

perm({1,3})=1perm({3})+3perm({1})

perm({1,2})=1perm({2})+2perm({1})

实现代码如下:

#include <stdio.h>
#define N 10

int a
;

void swap(int *a, int *b) {
int m;
m = *a;
*a = *b;
*b = m;
}

void perm(int *a, int l, int r) {
int i;
if (l == r) {
for (i = 0; i <= r; i++) {
printf("%d", a[i]);
}
printf("\n");
} else {
for (i = l; i <= r; i++) {
swap(&a[l], &a[i]);
perm(a, l + 1, r);
swap(&a[l], &a[i]);
}
}
}

int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
perm(a, 0, 2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: