思考:
从键盘输入一个字符串(没有字母重复),输出所有的排列
样例输入:abc
样例输出:
abc
acb
bac
bca
cab
cba
我将以递归的方法进行求解
非递归能做出来吗?
显然是可以的,因为大多数递归问题都可以靠循环来实现
#includevoid p(char x[], int m, int n) { int i; char temp, t[100]; if (m == n) //对最后一个字符全排列(长度为1) printf("%sn", x); else { //对[m,n]之间的字符串全排列 for (i = m; i <= n; i++) { //因为对[m+1,n]全排列的过程中,修改了x。 //所以在[m+1,n]全排列之前,备份x,即:x=>t strcpy(t, x); //先把第i个字符换到最前面 temp = x[m]; x[m] = x[i]; x[i] = temp; //然后对[m+1,n]的字符全排列 p(x, m + 1, n); //在[m+1,n]全排列之后,恢复x,即:t=>x strcpy(x, t); } } } int main() { char x[] = "abc"; int sz = sizeof(x) / sizeof x[0];//求字符串元素的个数 int m = 0; int n = sz - 2; p(x, m, n); return 0; }
具体细节再代码中已经标出,大概的思路就是将每个字符进行分解
✨例如abcde
就需要先把a进行固定,然后再求bcde的排列方式
然后再对b进行固定,对acde进行全排列
……
在对其中的[m,n]之间来实现排列,每一次的调用函数,m都加上1,最终m==n,并打印结果
最终的结果就有5*4*3*2*1=120种
欢迎点赞收藏加关注,如若有问题可以提出来
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)