递归:在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题。
而在初级的题目中,如果是得出所有情况,有时可以直接找规律。今天这个题目同是如此。(但它要求我列举出所有情况,所以我的代码使用了递归)
题目如下:
给定n个字符{r1,r2,…,rn},要求生成这n个字符的全排序。
生成全排列思想如下:
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。
集合X中元素的全排列记为perm(X)。
(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。R的全排列可归纳定义如下:
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;
当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…,(rn)perm(Rn)构成。
输入
输入包括若干个用例,第一行为一个正整数k(1<=k<=10),表示用例个数。
每个用例占两行,其中第一行为该用例字符的个数n(1<=n<=5),第二行为n个字符,字符可以是数字和大小写字母,字符之间用空格隔开。
可以假定给定同一用例中不出现相同的字符。
输出
输出每个用例的全排列,每一个排列占一行。各用例全排序之间用一空行隔开。
样例输入 复制
2
2
1 2
3
a c b
样例输出 复制
12
21
acb
abc
cab
cba
bca
bac
我们可以先对其简单的子情况进行分析,若只有两个数
![](https://i-blog.csdnimg.cn/blog_migrate/60c18dea85e65c2b37fd3bb138cd0219.png)
有三个数:
![](https://i-blog.csdnimg.cn/blog_migrate/16b3a6b08ef26c0336605f8e36ead41c.png)
此时情况为当前的三种乘以之前的两种;3*2
有四个数:
![](https://i-blog.csdnimg.cn/blog_migrate/e8453a4e199b917fd4259aae92731c08.png)
同理此时总情况数为4*6;
........
根据以上思路,写出递归代码也较为容易
#include<stdio.h>
char a[10];//将数组定为全局变量,自动赋值为0,方便以后输出
int exchange(char a[], int pos, int n)
{
if (pos == n - 1)//因为数组从0开始,故末位置应为n-1;
{
printf("%s\n", a);
return 0;
}
else
{
for (int i = pos; i < n; i++)
//从当前位置开始,往之后位置交换;
{
char t;
t = a[pos];
a[pos] = a[i];
a[i] = t;
exchange(a, pos + 1, n);
//交换完后,恢复原数组;
t = a[i];
a[i] = a[pos];
a[pos] = t;
}
}
}
int main()
{
int n,sam,exa;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &sam);
getchar();
for (int i = 0; i < sam; i++)
{
scanf("%c", &a[i]);
getchar();
}
exchange(a, 0, sam);
printf("\n");
}
}
新手小白,翻车勿怪。
创作不易,点个赞呗。