递归的简单用法
题目
分别输出1-i辆公交车出站不同顺序的情况总数;(公交车进出站遵循先进先出原则)
代码如下
package com.hzc.bluecap;
import java.util.Scanner;
public class BusOutbound {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("请输入车辆总数");
int i=sc.nextInt();
busOutbound(i);
}
private static void busOutbound(Integer i) {
// TODO Auto-generated method stub
for (int j = 1; j < i+1; j++) {
System.out.println(j+":"+outboundCount(j));
}
}
private static Integer outboundCount(Integer i) {
// TODO Auto-generated method stub
return outboundCount(i,0);
}
private static Integer outboundCount(Integer i, int j) {
//i为待进站数量
//j为站中数量
// TODO Auto-generated method stub
if(i==0)return 1;
if(j==0)return outboundCount(i-1,1);
return outboundCount(i-1, j+1)+outboundCount(i,j-1);
}
}
解题步骤
此题是在b站看到的,原视频链接: https://www.bilibili.com/video/BV1tt41177mu?p=11
下面是个人理解
1.题目分析:由题目可知当所有车都在车站时只有一种出站情况,出站情况的区别在当车站有车时的进站再出和直接出站两种情况
2.递归方法使用:根据题目很容易想到用递归,递归的思想是将一大块化为一小块在进行分步解决,其中较为重要的是部分之中的联系,根据视频中的想法使用一个参数找不到规律可能是参数不够,再根据题目分析中待进站车辆数、站中车辆数的关系可得出两个参数,返回条件是当待进站的车辆为零时就返回1,考虑到站中可能为零的情况所以还要加一个判断当车站中为零时就从待进站的车辆中开一辆进站,出站的可能情况为直接从车站出去和先进站在出站的总和,最后再将总数返回,outboundCount(Integer i)方法是为了和两个参数进行联系;
总结
求不同顺序或者不同步骤总数这一类的算法题目可以优先考虑递归
递归得先有两个条件,各部分的关系和最终的返回值;(没有返回值会报栈溢出错误)