你还在用A求排列方法吗?递归求不同排列方法
?思考:
从键盘输入一个字符串(没有字母重复),输出所有的排列
样例输入:abc
样例输出:
abc
acb
bac
bca
cab
cba
我将以递归的方法进行求解
非递归能做出来吗?
显然是可以的,因为大多数递归问题都可以靠循环来实现
#include<stdio.h>
void 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种
欢迎点赞收藏加关注,如若有问题可以提出来????
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码