递归

作者: Tsukinousag | 来源:发表于2021-01-24 10:54 被阅读0次

2.1递归实现指数型枚举

原题链接

从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。

//递归写法一:vector存
#include<iostream>
#include<vector>

using namespace std;

vector<int>chosen;

int n;

void dfs(int x)
{
    if(x==n+1)//递归边界
    {
        for(int i=0;i<chosen.size();i++)
            printf("%d ",chosen[i]);
        cout<<endl;
        return ;
    }
    
    dfs(x+1);//不选
    
    chosen.push_back(x);
    dfs(x+1);//选
    chosen.pop_back();//回溯还原现场
    
}

int main()
{
    cin>>n;
    dfs(1);
    return 0;
}
//递归写法二:用一个book数组记录
#include<iostream>

using namespace std;

int book[20];
int n;

void dfs(int x)
{
    if(x==n+1)
    {
        for(int i=1;i<=n;i++)
        {
            if(book[i]==1)
                cout<<i<<' ';
        }
        cout<<endl;
        return ;
    }
    book[x]=1;//选
    dfs(x+1);
    
    book[x]=0;//不选
    dfs(x+1);
}

int main()
{
    cin>>n;
    dfs(1);
    return 0;
}
 

//递归写法三:状态压缩递归
#include <iostream>

using namespace std;

int n;

void dfs(int x,int state)//x表第几位,state表选还是不选
{
    if(x==n)//0~n-1位
    {
        for(int i=0;i<n;i++)
            if(state>>i&1)//检查state的0~n-1位是否为1
                cout<<i+1<<' ';//第0位数表示1,第一位数表示2.......
        cout<<endl;
        return ;
    }
    dfs(x+1,state);//不选
    dfs(x+1,state|1<<x);//第x位置为1
}

int main()
{
    cin>>n;
    dfs(0,0);
    return 0;
}

2.2递归实现组合型枚举

原题链接

从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。

#include<iostream>
#include<vector>


using namespace std;

vector<int>st;
int n,m;

void dfs(int x)
{
    if(st.size()>m||st.size()+(n-x+1)<m)//如果已经选择了超过m个数,或者即使再选上剩余的所有数也不能够m个
        return ;
    if(x==n+1)
    {
        for(int i=0;i<st.size();i++)
            printf("%d ",st[i]);
        cout<<endl;
        return ;
    }
    
    st.push_back(x);
    dfs(x+1);
    st.pop_back();
    
    dfs(x+1);
}


int main()
{
    cin>>n>>m;
    dfs(1);
    return 0;
}

2.3递归实现排列型枚举

把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。

原题链接

#include<iostream>

using namespace std;

int book[10];
int a[10];
int n;

void dfs(int x)
{
    if(x==n+1)
    {
        for(int i=1;i<=n;i++)
            printf("%d ",a[i]);
        cout<<endl;
        return ;
    }
    //填数
    for(int i=1;i<=n;i++)
    {
        if(book[i]==1)continue;
        a[x]=i;
        book[i]=1;
        dfs(x+1);
        book[i]=0;//回溯
    }
}

int main()
{
    cin>>n;
    dfs(1);
    return 0;
}

相关文章

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • 二叉树的遍历

    先序递归: 非递归: 中序递归: 非递归: 后序递归: 非递归 层次遍历

  • 二叉树的前序、中序、后序遍历(递归、非递归)

    二叉树 前序 递归: 非递归: 中序 递归: 非递归: 层序 递归: 非递归:

  • 树的遍历,golang实现

    先序,递归 中序,递归 后序,递归 先序,非递归 中序,非递归 后序,非递归 层序遍历

  • 3 递归(19)(方法层面的高级循环)

    递归 树的递归 其它递归

  • 递归,递归,递归

    在我告诉你什么是递归之前,你应该读一下这篇文章:递归,递归,递归。 如果你没有这么做,那么表扬一下自己。如果你那么...

  • 数据结构-树的遍历

    1. 先序遍历 递归实现 非递归实现 2. 中序遍历 递归实现 非递归实现 3. 后序遍历 递归实现 非递归实现 ...

  • 树的遍历

    节点结构: 先序遍历 递归 非递归 后序遍历 递归 非递归 中序遍历 递归 非递归 层序遍历 类库 有了上述遍历算...

  • 算法图解系列之递归[03]

    3 递归 3.1 递归<函数> 3.2 基线条件和递归条件 3.3 递归调用栈

  • 三十八、递归

    一、递归的概述 递归,指在当前方法内调用自己的这种现象。 递归分为两种,直接递归和间接递归。 直接递归称为方法自身...

网友评论

      本文标题:递归

      本文链接:https://www.haomeiwen.com/subject/dqqmzktx.html