您的位置:首页 > 其它

递归实现集合全排列

2015-08-09 21:52 211 查看
/**递归对于我真的很那理解,好好的心情都被破坏了大化小,小化没,这就是递归
假设求 1,2,3,4,5的全排列就是求

1,2,3,4,5
2,1,3,4,5
3,2,1,4,5
4,2,3,1,5
5,2,3,4,1
后四个数的全排列然后在进行划分直到求得是最后两个数的全排列虽然我很菜,
但我也在慢慢的理解递归,感觉递归很重要,深搜基本都是递归实现的so,我要好好研究递归
有大神这么说,我感觉很有道理
********************************************************************************************************************************
*(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);
*(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;
*(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;
********************************************************************************************************************************
*/

#include<stdio.h>
#include<algorithm>

using namespace std;

///确定目标:实现对a[0]到a[maxDepth-1],全排列
void fun(int a[], int cur, int maxDepth)
{
if(cur == maxDepth)///递归的边界(剩下最后一个元素的时候)
{
for(int i = 0; i < maxDepth; i++)
printf("%d ", a[i]);
printf("\n");
}
else
for(int i = cur; i < maxDepth; i++)
{
swap(a[cur], a[i]);
fun(a, cur+1, maxDepth);
swap(a[cur], a[i]);
}
}

int main()
{
int n,a[15];
while(scanf("%d",&n))
{
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
fun(a, 0, n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: