给定n(n>=1)个元素的集合,输出该集合的所有可能的排列。
如abc的全排列的个数为3!=6个
分别为:abc, acb a开头的bc全排列
bac, bca b开头的ac全排列
cba, cab c开头的ba全排列
递归的线索是后面跟着...的全排列,也就是n个元素的排列问题可以转化为n-1个元素的排列问题
代码如下:
1 /* 2 递归是从前往后执行,结果从后往前回溯 3 abcd的全排列为 1次 4 a bcd的全排列 a和a换位置之后 转化为求bcd的全排列 求完排列后需要换回来保证初始字符串不变 5 b acd的全排列 a和b换位置之后 转化为求acd的全排列 求完排列后需要换回来保证初始字符串不变 6 c bad的全排列 a和c换位置之后 转化为求bad的全排列 求完排列后需要换回来保证初始字符串不变 7 d bca的全排列 a和d换位置之后 转化为求bca的全排列 求完排列后需要换回来保证初始字符串不变 8 结束条件:当只剩最后一个字母时,他的全排列就是他自己 9 */ 10 11 #include<stdio.h> 12 #define SWAP(x,y,t) ((t=x),(x)=(y),(y)=(t)) 13 void perm(char *list,int i,int n); 14 int main() 15 { 16 char a[5]="abcd"; 17 perm(a,0,3); 18 printf("%s",a); 19 return 0; 20 } 21 22 void perm(char *list,int i,int n) 23 { 24 int j,temp; 25 if(i == n){ //当i是最后一个元素时递归结束 26 for( j = 0; j <= n; j++ ) 27 printf("%c",list[j]); 28 printf("\n——————\n"); 29 } 30 else{ 31 for( j = i ; j <= n ; j++ ){ //求i到n的全排列 32 SWAP(list[i],list[j],temp);//以每一个元素为开始的全排列 33 perm(list,i+1,n); //求i+1到n的全排列 34 SWAP(list[i],list[j],temp);//保证初始数组不变 35 } 36 } 37 } 38 39 40
时间: 2024-12-30 03:34:17