实现全排列的另一种方法,就是实现递归。
实现思路:
假如 allsort(a b c);分治思想化为a+allsort(b c); b+allsort(a c), c+allsort(a b);
递归一层后计算第二层时:如allsort(b c)时,化为b+allsort(c) 和 c+allsort(b);
此时问题就明显了,首先确定一个元素,求剩下的全排列,如此类推下去做一个递归;
实现代码:
#include <stdio.h> #define N 4 int a[N]; void perm(int); void print(); void move(int, int); int main(){ int i; for(i = 0; i<N; i++){ scanf("%d",&a[i]); } perm(0); } void perm(int offset){ int i; if(offset == N-1){ print(); return; }else{ for(i = offset;i < N; i++){ move(i, offset); perm(offset + 1); move(i, offset); } } } void print(){ int i; for(i = 0; i < N-1; i++) printf("%d ",a[i]); printf("\n"); } void move(int i, int offset){ int temp; temp = a[offset]; a[offset] = a[i]; a[i] = temp; }
自此, 全排列的递归算法就算实现了。。。