你还在用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
分享
二维码
< <上一篇
下一篇>>