//原理:利用组合数学知识,(n, m)为从n个数中选择m个,计n中某个为a,分为两种情况:一,若本次选择的包含a,则需要从剩余n-1个选择m-1个数;二,若本次选择不包含a,则需要从剩余的n-1个里面选择m个。从而可以形成递归算法:#includevoid combination2(char *str, char *result, char *p, int m){ if(strlen(p)== m){//边界条件一:从剩余的m中选择m个,只有一种方法,全选即可。 printf("%s\n", p); return; } if(m== 1){//边界条件二:从剩余的strlen(p)个中选择1个,有strlen(p)个方法,再与前面保存的result“拼接”即可。 char *q; for(q=p; (*q)!= '\0'; ++q){ printf("%s%c\n", result, *q); } return; }else{ char *temp_result= result; *(++temp_result)= *p; if(*(p+1)!='\0'){ combination2(str, temp_result, p+1, m-1); } if(*(p+1)!= '\0'){ combination2(str, result, p+1, m); } }}void combination(char *str){ int i; for(i=1; i<= strlen(str); ++i){ char result[6]={};//可以根据需要申请大小 combination2(str, result, str, i); }}int main(void){ char *str="abc"; combination(str);}