如何用java递归实现话说大诗人李白,一生好饮。 幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒 2 斗。 他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,他一共遇到店 N 次,遇到花 M 次。 已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白这一路遇到店和花的顺序,有多少种不同的可能? 注意:壶里没酒 (0 斗) 时遇店是合法的,加倍后还是没酒;但是没酒时遇花是不合法的。 输入格式 第一行包含两个整数 N 和 M。 输出格式 输出一个整数表示答案。由于答案可能很大,输出模 1000000007 的结果。
时间: 2023-02-16 18:39:02 浏览: 237
你可以使用递归来实现这个算法。你可以定义一个函数,接收三个参数:当前遇到的店的数量、当前遇到的花的数量和当前酒壶中的酒的数量。如果当前遇到的花的数量等于 M,并且酒壶中的酒数量为 0,那么返回 1。否则,如果当前遇到的店的数量小于 N,则调用递归函数,将店的数量加 1,将酒的数量翻倍,花的数量不变。如果当前遇到的花的数量小于 M,则调用递归函数,将花的数量加 1,将酒的数量减少 1。最后,将两次递归的结果相加,并将结果对 1000000007 取模,返回结果。
这是一个使用递归来实现的示例代码:
```java
public static int mod = 1000000007;
public static int solve(int n, int m, int k) {
if (n == N && m == M && k == 0) {
return 1;
}
int res = 0;
if (n < N) {
res = (res + solve(n + 1, m, k * 2)) % mod;
}
if (m < M && k > 0) {
res = (res + solve(n, m + 1, k - 1)) % mod;
}
return res;
}
```
在这段代码中,`solve` 函数就是递归函数,它接收三个参数:当前遇到的店的数量、当前遇到的花的数量和当前酒壶中的酒的数量。
阅读全文