递归与递推一

Posted 猪八戒1.0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归与递推一相关的知识,希望对你有一定的参考价值。

目录

递归实现指数型枚举

题目

​分析:

代码      

递归实现排列型枚举

题目:

 分析:

 代码:   

递归实现组合型枚举

题目

分析:

代码:


递归实现指数型枚举

题目描述

 分析:

        所有可能,只会选与不选

代码      



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;
		
	

以上是关于递归与递推一的主要内容,如果未能解决你的问题,请参考以下文章

递归与递推电话号码

递归与递推电话号码

递归与递推排序集合

递归与递推编码

递归与递推集合的划分

递归与递推诸侯安置