船长 海盗oj235 递归实现指数枚举(笔记自用)

在这里插入图片描述
在这里插入图片描述
首先想到这是一个组合问题,同时对元素罗列的顺序有一定的要求。要熟练掌握递归输出的特点,通过与本题输出样例的比对推得代码的实现逻辑。
观察输出样例,第一位是1的情况下分一类,若是2分另外一类,每类中再分小类进行继续的划分,直到(某个条件)停止。这种分支的结构让我首先联想起了深搜。
那么,只要开一个数组,数组元素下标代表填的数的位置,将每次罗列的值存进去,再输出就行了,利用递归的特性,当递归往回走的时候,每个元素的值也会被重新赋予,从而实现所有可能的罗列。
那么如何输出呢?第一次我们输出一个数,第二次两个,或许可以设置一个变量level,来代表当前循环的层数,第一层填一个数就输出一个,以此类推。
以上都是看题解前的想法,接下来是按船长给的思路写的代码#include<stdio.h>
int arr[10];
void myprintf(int n){
for(int i=0;i<=n;i++){
if(i)printf(" “);
printf(”%d",arr[i]);
}
printf(“\n”);
return;
}
void solve(int i,int j,int n){
if(j>n) return;
for(int k=j;k<=n;k++){
arr[i]=k;
myprintf(i);
solve(i+1,k+1,n);
}
return;
}
int main(){
int n;
scanf(“%d”,&n);
solve(0,1,n);
return 0;
}
给核心函数设置了三个变量,i,j,n。i表示当前数的位置,j代表当前位置可以取的最小值,n是最大值。其中j的设置很关键,它确保了我们的枚举不会重复,后一个数一定比前一个数要大。当枚举完这一层的数之后,到下一个位置时i+1,同时可以取的最小值也要+1,也就是k+1,因为我们用k来从j循环到n,下一层的最小值是取决于这个k是多少的,上一层取了k,下一层就只能从k+1开始取了。自己敲代码的第一遍将k写成了j,是犯的唯一错误。
最后递归结束的条件就是当枚举的最小值大于最大值了,说明这一层枚举完了,我们就跳出这一层,返回上一层。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值