李白喝酒
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。