李白喝酒
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.*;
public class Main {
static Scanner sc = new Scanner(System.in);
static int count = 0;
static char list[] = new char[15];
static void drink(int wine, int a, int b, int k) {
if (a < 0 || b < 0 || (wine == 0 && k < 14) || (wine > 0 && k > 14)) return;
if (wine == 1 && a == 0 && b == 0) {
count++;
return;
}
list[k] = 'a';
drink(wine * 2, a - 1, b, k + 1);
list[k] = 'b';
drink(wine - 1, a, b - 1, k + 1);
}
public static void main(String[] args) throws IOException {
list[14] = 'b'; //最后一次一定是遇到花才能把酒喝完
drink(2, 5, 9, 0);
System.out.println(count);
}
}
递归题目一直以来就是自己比较疑惑的问题,但是通过李白喝酒这一题,可以初级的了解了递归这一类题目的解题思路。首先需要写出一个递归函数,不管怎么样既然是递归函数,那必须要有递归的出口,还有我们想要做的事情。在代码中drink这一递归函数里面,第一个if就是这一个递归函数的出口,但是递归函数的出口要想得全面,不能遗漏,否则会有错误。
第二个if是一个结束条件,如果剩下的酒只有1,a和b都没了,那么就成立,即可结束,然后count计数,便返回。因为我们已经规定最后一个一定是遇到花,所以就直接给第15个元素赋值b。并且在使用递归函数时,我们也只输入了9个b,既第二个if成立时,那么这一情况就成立,可以return。
