排列组合问题递归非递归实现方法
问题:
在n个球中,任意取出m个(不放回),共有多少种取法?
方法一:手动实现阶乘函数,使用排列组合数学公式计算:
public class Main { public static int factorial(int n){ int product=1; if(n==0) return 1; else if(n<0){ System.out.println("Input cannot be negative!"); return -1; } for(; n>=1; n--){ product*=n; } return product; } public static int getBalls(int n, int m){ //在n个球中,任意取出m个(不放回),共有多少种取法 if(n<m) return 0; return factorial(n)/(factorial(m)*factorial(n-m)); } public static void main(String[] args) { System.out.println(getBalls(3, 2)); } }
方法二:利用递归的思想
思路:强行分成n-1的问题,想象有一个特殊球,一种是取到该球的取法,一种是不取该球的方法。
public class Main { public static int getBalls(int n, int m){ //在n个球中,任意取出m个(不放回),共有多少种取法 if(n<m) return 0; else if(m==n||m==0) return 1; return getBalls(n-1, m-1)+getBalls(n-1, m); } public static void main(String[] args) { System.out.println(getBalls(3, 2)); } }