public class 递归取球 {
public static void main(String[] args) {
System.out.println(f(10,3));
}
/**
* 从m个球中任意取n个球(不放回),方法的个数
* @param m 球总数
* @param n 取球数
* @return 取法
*/
private static int f(int m, int n) {
if(m<n) return 0;
if(m==n) return 1;
if(n==0) return 1;
return f(m-1, n-1)+f(m-1, n);
}
}
分析
为便于理解,假设n个球中有一个球是特殊球,可以对取出的m个球中分为两种情况:包含特殊球和不包含特殊球。
- 包含特殊球
则问题变成了从 (n-1) 个球中取 (m-1) 个球,因为特殊球一定被取出来。所以这种情况的递归调用为: f(n-1,m-1); - 不包含特殊球
这种情况下问题变成了求从 (n-1) 个球中取 m 个球,因为特殊球一定不取。递归调用为:f(n-1,m) .
综上,递归调用为两种情况之和:return f(m-1, n-1)+f(m-1, n) .