92. 递归实现指数型枚举

92. 递归实现指数型枚举

在这里插入图片描述
https://www.acwing.com/problem/content/description/94/
题解:
先画一个递归树分析。我们可以知道的是每个数我们都有不选两种选择。
我们画一个当n=3时的递归树。
在这里插入图片描述
那么我们如何用代码实现呢?
我们可以写一个函数 dfs(int n) 其中 n代表的是当前第几个数的判断。
例如 dfs(0) (数组的下标默认是0) 代表的是第一个元素的判断 即选还是不选。
当我们判断的 数的个数达到n说明已经判断完了。就输出,return。

我们还得用一个数组来保存每个数的状态。 0代表还没有判断(或考虑),1代表选了,2代表不选。
那么代码如下:

#include<cstdio>
#include<iostream>
int a[20]; // 0代表还没考虑 1代表选 2代表不选
int n; 
void dfs(int w)//代表当前选的是第个数
{
    if(w==n)
    {
        for(int i=0;i<n;i++)
        {
            if(a[i]==1)
            	printf("%d ",i+1);
        }
        printf("\n");
        return;
    }
    a[w]=2;//该数不选  
    dfs(w+1);//判断下一个数
    a[w]=0;//恢复现场
    
    a[w]=1;//该数选
    dfs(w+1);//判断下一个数
    a[w]=0;//恢复现场。
}
int main(void)
{
    scanf("%d",&n);
    dfs(0);
    return 0;
}

那么啥是恢复现场呢?
在这里插入图片描述
有的人不习惯从0开始。那么我们就写一个下标从1开始的。

#include<cstdio>
#include<iostream>
int a[20]; // 0代表还没考虑 1代表选 2代表不选
int n; 
void dfs(int w)//代表当前选的是第个数
{
    if(w>n)
    {
        for(int i=1;i<=n;i++)
        {
            if(a[i]==1)
            	printf("%d ",i);
        }
        printf("\n");
        return;
    }
    a[w]=2;
    dfs(w+1);
    a[w]=0;
    
    a[w]=1;
    dfs(w+1);
    a[w]=0;
}
int main(void)
{
    scanf("%d",&n);
    dfs(1);
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[30],vis[30],n;
void dfs(int index)
{
    if(index==n)
    {
        for(int i=0;i<n;i++) if(vis[i]==1) cout<<i+1<<" ";
        cout<<endl;
        return;
    }
    vis[index]=1;
    dfs(index+1);
    
    vis[index]=0;
    dfs(index+1);
}
int main(void)
{
    cin>>n;
    dfs(0);
    return 0;
}

注意: 递归一定要恢复现场。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值