C语言实例解析精粹学习笔记——30
实例30:
用已知字符串s中的字符,生成由其中n个字符组成的所有字符排列。设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次。例如,对于s[]="abc",n=2,则所有字符排列有:ba,ca,ab,cb,ac,bc。
思路:
实际上目前为止还是不能完全理解书中的程序,也不能在脑海中明确的构想出整个程序是如何递归的。对于这道题的大致思路理解如下:对于一个字符串abcdef的所有两个字母的排列用以下方式可能是比较清晰的,从字母a开始:
1、ab,ac,ad,ae,af
2、bc,bd,be,bf
3、cd,ce,cf
4、de,df
5、ef
在编写程序时,用一个全局字符数组存放要排列的字符,将a放在最后,依次遍历b,c,d,e,f。再将b放在倒数第二的位置,再进行遍历。直到所有内容完成。
但是在具体编程时我是写不出来这种程序的,现把书中的解析及代码放到下面:
#include <stdio.h> #include <stdlib.h> #define N 20 char w[N]; void perm(int n, char *s) { char s1[N]; int i; int count = 0; if(n < 1) printf("%s\n",w); else { strcpy(s1, s); for(i=0; *(s1+i); i++) { *(w+n-1) = *(s1+i); *(s1+i) = *s1; *s1 = *(w+n-1); count++; perm(n-1, s1+1); } } } int main() { int n = 2; char s[N]; w[n] = '\0'; printf("This is a char permutation program!\nPlease input a string:\n"); gets(s); puts("Please input the char number of permuted:"); scanf("%d", &n); puts("The permuted chars are:\n"); perm(n,s); puts("\nPress any key to quit..."); return 0; }