递归与递推一

目录

递归实现指数型枚举

题目

​分析:

代码      

递归实现排列型枚举

题目:

 分析:

 代码:   

递归实现组合型枚举

题目

分析:

代码:


递归实现指数型枚举

题目描述

 分析:

        所有可能,只会选与不选

代码      



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static int n;
	static int []st=new int [16];//用来存状态1表选上0表没选上
	public static void main(String[] args) throws IOException {
		n=Integer.parseInt(br.readLine());
		dfs(1);
	}
	private static void  dfs(int u) {
		if(u>n) {
			for(int i=1;i<=n;i++) {
				if(st[i]==1) {
					System.out.print(i+" ");
				}
			}
			System.out.println();
		}
		else {
			//不选
			st[u]=2;
			dfs(u+1);
			st[u]=0;
			//选
			st[u]=1;
			dfs(u+1);
			st[u]=0;
		}
	
	}
}

递归实现排列型枚举

题目:

 

 分析:

        用个布尔型数组记录是否枚举,再存下来记录即可

 代码:   

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/*
 * boolean全局默认false
 * int    全局默认0局部默认随机
 */

public class Main {
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static int N=10;
	static int n;
	static boolean []used=new boolean [N];//用来存状态是否被使用
	static int []st=new int [N];//用来存状态
	public static void main(String[] args) throws  IOException {
		n=Integer.parseInt(br.readLine());
		dfs(1);
	}
	public static void dfs(int u) {
		if(u>n) {
			for(int i=1;i<=n;i++) {
				System.out.print(st[i]+" ");
			}
			System.out.println();
		}
		else {
			for(int j=1;j<=n;j++) {
				//没有被使用
				if(!used[j]) {
					used[j]=true;
					st[u]=j;
					dfs(u+1);
					//恢复状态
					used[j]=false;
					st[u]=0;
				}
			}
		}
	}
}

递归实现组合型枚举

题目

分析:

        这种n个数选m个数的全排列需要dfs两个参数

代码:

/*
 * 要实现不重复就要保证每次选择的数比前一次大
 * 真的狗
 */
import java.util.Scanner;

public class Main {
	static int n,m;
	static int way[];
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n=sc.nextInt();
		m=sc.nextInt();
		way=new int[m+1];
		dfs(1,1);
	}
	private static void dfs(int u, int start) {
		/*
		 * 剪枝 排除一些不可能的情况 可以提升速度
		 * 比如n=5,m=3,第一个是4或者5的都要排除
		 * 选第u个数,说明已经选了u-1个数
		 * 从start开始说明还可以选n-start+1个数
		 * 如果u-1+n-start+1<m说明不够选
		 * return提前退出
		 */
		
		if((u-1+n-start+1)<m) return;
		if(u>m) {
			for(int i=1;i<=m;i++) {
				System.out.print(way[i]+" ");
			}
			System.out.println();
			return;//真狗
		}
		for(int j=start;j<=n;j++) {
			way[u]=j;
			dfs(u+1, j+1);
			way[u]=0;
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪八戒1.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值