全排序递归算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排序递归算法相关的知识,希望对你有一定的参考价值。
给定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
以上是关于全排序递归算法的主要内容,如果未能解决你的问题,请参考以下文章
C++代码 递归算法 n个数的全排列 (是任意的,可不连续) 要求: 提示输入数的个数n 然后提示输入这n个