1. 问题描述:在m个不同的球中取出n个球,问有多少种的取法?
2. 思路分析:
① 这个实际上是一个组合的问题,我们在高中的时候学习过组合公式:
所以可以求解相应的阶乘来进行求解
② 除了使用上面的求解阶乘的方法来进行求解我们还可以使用递归来进行求解,但是怎么样使用递归来求解呢?
分析题目可以知道对于当前的球我们可以取出来也可以不取,所以这样就存在着两种的选择,把这两种选择的结果最终加起来就是我们要求求解的结果
对于当前的球我们可以选择不取,那么我们就可以在剩下的m - 1球中来取出n个球,假如取得话我们可以在剩下来的m - 1个球中取出n - 1个球 这样就可以递归求解下去,最终就可以求得我们需要的结果
③ 其实这也是深度优先搜索的过程,对于当前的球我们可以取,也可以不取,那么这样就存在着两个平行的状态,然后递归求解下去,对于出口的设计我们可以这样想,m和n都是在变化的,对于不取这个平行状态那么m这个参数最终是会和n相同的那么接下来的所有球都是要取的,所以存在一种取法,对于取当前这个球这个平行状态那么我们最终n这个参数最终是会变成零的,这也是一种取法,所以对于有返回值的递归我们需要结合题目和相关参数的变化来进行确定
在想的时候可以把其中的过程想象成二叉树,分别递归左子树和右子树来进行求解
3. 代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
if(m < n) {
System.out.println(-1);
System.exit(0);
}
long res = f(m, n);
System.out.println(res);
sc.close();
}
private static long f(int m, int n) {
//实际上对于当前的球我们可以取也可以不取所以存在两种平行的状态
if(n == m) return 1;
if(n == 0) return 1;
return f(m - 1, n) + f(m - 1, n - 1);
}
}