蓝桥杯备战——递归篇

持续更新

一、39级台阶

问题描述

小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。
先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。
那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。

解题思路

上 1个台阶 或者 2个台阶 分别做出口


/**
 * 
 * @author sjf666
 * 
 * 2020年4月3日上午8:55:14
 */
public class Demo05_39级台阶 {

	static int count ;
	public static void main(String[] args) {
		
		f(0, 0);

		System.out.println(count);
	}

	/**
	 * 
	 * @param step  步数
	 * @param floor  楼梯阶数
	 * @return
	 */
	public static void f(int step , int floor) {
		if(floor > 39)
			return;
		
		if( floor == 39  && step % 2 == 0  ) {
			
			count ++;
			return;
		}
		
		//有两种情况  是一个 二叉树的生成过程 
		f(step+1, floor+1);
		
		f(step+1, floor+2);

	}
}

二、李白喝酒

问题描述

话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。

则:babaabbabbabbbb 就是合理的次序。
像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

解题思路

基本的递归题
找到不同的处理方式作为进入下一层的标志

此题就是 李白遇见花 或者 遇见酒 分别做讨论就行

/**
 * 
 * @author sjf666
 * 
 * 2020年4月2日下午9:32:59
 */
public class Demo03_李白打酒 {

	static int count ;
	static StringBuffer ans ;
	public static void main(String[] args) {
		
		ans =new StringBuffer("");  //初始化
		f(2, 5, 10);

		System.out.println(count);  //14
	}

	public static void f(int jiu ,int dian , int hua) {
		if(jiu <= 0 || dian < 0 || hua == 0 )
			return;
		if(dian == 0 && hua == 1) {
			if(jiu == 1) {
			//System.out.println(ans+"b");
				count ++ ;
			}
		 return;	
		}
		ans.append('a');	
		f(jiu*2, dian-1, hua);
		ans.deleteCharAt(ans.length()-1);
		ans.append('b');
		f(jiu-1, dian, hua-1);
		ans.deleteCharAt(ans.length()-1);
	}
}

三、六角填数

问题描述

如图所示六角形中,填入1~12的数字。
1
使得每条直线上的数字之和都相同。

图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?

解题思路

递归找出每个位置的数字 然后进行判断

/**
 * 
 * @author sjf666
 * 
 * 2020年4月3日上午9:53:21
 */
/*
 * 分析  用一维数组  规律搞清  答案要 a[5] 
 */
public class Demo06_六角填数 {

	static int[] ans = {1,8,0,0,0,0,0,0,0,0,0,3};  
	static int[] book = {0,1,0,1,0,0,0,0,1,0,0,0,0};  //标记数组
	public static void main(String[] args) {
		
		dfs(0);
		
	}
	
	
	public static void dfs(int step) {
		
		if(step == 12) {
			if(check()) {
				System.out.println(ans[5]);  //10
				System.exit(0);	//直接终止程序 
			}
			else 
			return;
		}
		
		if(ans[step] == 0) {
			for(int i = 1 ;i <= 12 ; i++) {
				if(book[i] == 0) {
					ans[step] = i ;
					book[i] = 1;
					dfs(step+1);
					book[i] = 0;
				}
			}
			ans[step] = 0 ;
		}
		else 
			dfs(step+1);
		
	}
	
	public static boolean  check() {
		int num = ans[0]+ans[2]+ans[5]+ans[7];
		if(num == ans[0]+ans[3]+ans[6]+ans[10] &&
		   num == ans[7]+ans[8]+ans[9]+ans[10] &&
		   num == ans[1]+ans[2]+ans[3]+ans[4]  &&
		   num == ans[1]+ans[5]+ans[8]+ans[11] &&
		   num == ans[4]+ans[6]+ans[9]+ans[11] 
		   )
			return true;
		else
			return false;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值