新手入门—递归实现排列型枚举

分析

排列型枚举的意思是在范围内有多少种不同的排列方法,我们可以想一下组合型枚举,
组合型枚举相当于寻找元素个数为n的子集并且以升序的形式输出。所以同一种组合只
有一种表达形式,那么排列型枚举相当于将同一种组合以不同的排列顺序表现出来。
我们首先看一下组合型枚举的递归函数。

//我们逐行来进行分析
void dfs(int cur)
{
    if(cur == m + 1) {
        for(int i = 1; i <= m; ++i) cout << arr[i] << " ";//将元素组合输出
        puts("");
        return ;//返回上一次递归
    }
    for(int i = 1; i <= n; ++i) {
        if(vis[i] || i < arr[cur - 1]) continue;//判断语句i < arr[cur - 1]查看组合是否按照升序进行
        //判断语句vis[i]查看组合里的元素是否重合。
        arr[cur] = i; //选第i个数
        vis[i] = true;  
        dfs(cur + 1);
        vis[i] = false;  //恢复
    }
}

而排列型枚举不要求升序排列(也不可能要求升序排列,升序排列只有一种情况)所以我们不需
要i < arr[cur - 1]这条判断语句,但是防止重复需要vis[i]语句。而且输出个数也要改变,
只需改成n即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值