蓝桥杯赛前冲刺补习第二课——《递归及其构造技巧》

第一题

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


解法:
  第一个递归练习题,我们总结一下题目的一些重要因素,39级台阶,一步可走1阶或2阶,一共要走偶数步
  这里要注意一下,正式的题目中很可能说完左右脚之后并不会给出偶数步的提示,而是需要自己去发掘题目的隐含条件,这种思考方式是非常重要的,要习惯于抽象问题,寻找隐藏条件,以便于优化问题逻辑,加快解题速度。

static int count = 0;
/**
 * @param times: 迈脚的次数
 * @param steps:台阶数
 */
public static void oneOrTwoSteps(int times,int steps) {
    /*
    oneOrTwoSteps(0, 0);
    System.out.println(count);
     */
    if(steps > 39){
  
  //如果走过的步数超过39则返回
        return;
    }

    if(steps == 39){
  
  //如果恰好为39阶
        /*
            且走的步数为偶数步
            视为此次行走方案符合要求
         */
        if(times%2 == 0){
            count++;
        }
        return;
    }

    //除去递归出口情况,特殊情况,递归的普通步骤
    oneOrTwoSteps(times+1, steps+1);//一步迈1个台阶
    oneOrTwoSteps(times+1, steps+2);//一步迈2个台阶
}

第二题

X星球特别讲究秩序,所有道路都是单行线。
一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。
路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示。
图为一个丁字路口。
X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。
如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?
为了方便起见,假设检查站可容纳任意数量的汽车。
显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。


解法:
  车必须进检查站,死胡同先进后出的情况可以类比为一个栈,在单个过程中会出现两种情况:
  1.等待检查的车进1
  2.正在检查的车出1
  在状态总结完之后,我们开始考虑递归出口以及特殊情况:
  1.当等待检查的车辆数量为0时,即此刻将不会有进栈的操作,只能一一出栈,只有1中排列情况
  2.当正在检查的车辆数量为0时,即此刻将不会有出栈的操作,只能进栈

/**
 * 有三种情况:
 * 1.wait>0, checking<16 可进可出
 * 2.wait==0 剩下的车都进去了,return 1
 * 3.checking==0 没有车进去,无法出栈,只能进栈
 *
 * @param wait 等待检查的车辆数量
 * @param checking 正在检查的车辆数量
 * @return
 */
public static int starXCarCheck(int wait, int checking) {
    if (wait == 0) return 1;
    if (checking == 0) {
  
  //无法出栈,只能进栈
        return st
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值