Java蓝桥杯——递归实现指数型枚举

问题描述:

输入N,在1~N之间,以不同方案取数

输出格式:

每行输出一种方案。

同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。

对于没有选任何数的方案,输出空行。

本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。


问题分析:


具体代码:

package easy;

import java.util.Scanner;

public class Number_n {
	
	public static boolean[] a = new boolean[20];		//定义全局数组
	public static int N;
	
	public static void dfs(int n){
		if(n > N){
			for(int i = 1;i <= n;i++)
				if(a[i] == true)
					System.out.print(i + " ");
			System.out.println();
			return;		//到这里说明输出完毕了,必须“return”,退出此方法
		}
		
		a[n] = true;
		dfs(n+1);		//选了这个数
		
		a[n] = false;	//不选,所以要把标记标为false
		dfs(n+1);		//不选这个数
	}
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		N = input.nextInt();
		
		dfs(1);
		
	}

}
 

注意:

1、Java中定义全部变量/数组:在class内,一切方法外

eg:public static int[] a = new int[20];                //初始化数组要new,不要=null,不然后续会出错

        public static int a;

2、在递归方法中,如果递归方法返回void,那么方法中实现完递归出口后,一定要记得return,否则代码会顺着执行下去

3、在递归中,要时刻记得恢复现场。如果不好理解,可以对应画出递归搜索树,想象着,在回溯时,要回到这个节点的父节点状态,再进行扩展。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值