递归实现的三种枚举

简介: 递归实现的三种枚举

1.指数型枚举:1~n里选任意个的所有情况:

     通过数组记录每个数字的选择情况:未决定,选,不选

       对没选过的数,可以直接选或者不选,所以往选和不选两个方向递归

       递归参数是当前要做选择的数

void dfs(int x){
    if(x > n){
        for(int i = 1;i <= n;i++){
            if(f[i] == 2) cout << i << " ";
        }
        puts("");
        return;
    }
    f[x] = 2;
    dfs(x+1);
    // f[x] = 0;
    f[x] = 1;
    dfs(x+1);
    // f[x] = 0;
}

2.组合型枚举

       1~n里·选m个的所有情况

       bool数组记录选择情况

       没选过就选

       //通过保证递增来保证枚举的情况不和之前的情况重复

       递归参数写当前在选第几个数

void dfs(int x){
    if (x + n - (f[x-1]+1) < m) return;
    // 剪枝:凑不齐m个数了
    if(x > m){
        for(int i = 1;i <= m;i++){
            cout << f[i] << " ";
        }
        puts("");
        return ;
    }
    for(int i = f[x-1]+1;i <= n;i++){//通过保证递增来保证枚举的情况不和之前的情况重复
        if(!st[i]){
            f[x] = i;
            st[i] = true;
            dfs(x+1);
            f[x] = 0;
            st[i] = false;
        }
    }
}

3.排列型枚举

       bool数组记录选不选当前情况,递归时没选过就直接选

       递归不用保证递增

void dfs(int x){
    //dfs到达边界
    if(x > n){
        for(int i = 1;i <= n;i++){
            cout << f[i] << " ";
        }
        puts(" ");
        return;
    }
    //dfs 开始枚举分支
    for(int i = 1;i <= n;i++){
        if(!st[i]){
            st[i] = true;
            f[x] = i;
            dfs(x+1);
            st[i] = false;
            // f[i] = 0;dfs的回溯流程,但在代码层面无实际意义
        }
    }
}
目录
相关文章
|
30天前
|
算法
时间复杂度的定义与表示
时间复杂度的定义与表示
|
6月前
递归实现排列型枚举
递归实现排列型枚举
|
6月前
|
算法 测试技术 C#
C++二分查找算法:132 模式解法二枚举2
C++二分查找算法:132 模式解法二枚举2
|
6月前
|
算法 程序员 C#
C++二分查找算法:132 模式枚举3
C++二分查找算法:132 模式枚举3
递归实现组合型枚举
递归实现组合型枚举
34 0
|
测试技术 C语言
C语言题解 | 移除元素(多种解法)
这是力扣上的一道简单题,需求是 移除数组中的指定元素,并且要求 空间复杂度为O(1) ,即原地移除,我们可以用顺序表中的任意位置删除的思想解决这个题,符合题目要求,当然还有其他解法。
50155 1
C语言题解 | 移除元素(多种解法)
|
算法 C语言 C++
[c语言]二叉树 非递归算法(先中后遍历)
1.定义头文件加结构体变量 2.创建一棵树 3.初始化栈 4.头插法入栈 5.判断栈是否为空 6.出栈操作 7.先序遍历 8.中序遍历 9.后序遍历 10.主函数调用 11.运行结果:
130 1
|
人工智能
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟(二)
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟(二)
|
机器学习/深度学习
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟(四)
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟(四)