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

本文介绍了如何使用递归实现排列型枚举,解析了排列型枚举与组合型枚举的区别,并提供了组合型枚举的递归函数作为参考。在排列型枚举中,由于不需要升序排列,因此省去了特定的判断条件,通过vis数组防止重复,输出个数调整为n。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析

排列型枚举的意思是在范围内有多少种不同的排列方法,我们可以想一下组合型枚举,
组合型枚举相当于寻找元素个数为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即可。

代码
#include <bits/stdc++.h>
using namespace std;

int n;
int arr[30];
bool vis[30];
void dfs(int cur)
{
    if(cur == n + 1) {
        for(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值