递归实现集合全排列

/**递归对于我真的很那理解,好好的心情都被破坏了大化小,小化没,这就是递归
假设求 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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值