栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

你还在用A求排列方法吗?递归求不同排列方法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

你还在用A求排列方法吗?递归求不同排列方法

思考:

从键盘输入一个字符串(没有字母重复),输出所有的排列

样例输入:abc

样例输出:

abc

acb

bac

bca

cab

cba

我将以递归的方法进行求解

非递归能做出来吗?

显然是可以的,因为大多数递归问题都可以靠循环来实现

#include
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种


欢迎点赞收藏加关注,如若有问题可以提出来

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/698153.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号