排列组合问题递归非递归实现方法

问题:

在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));
    }
}

 

posted @ 2017-02-04 15:07  早睡早起锻炼身体啊  阅读(699)  评论(0编辑  收藏  举报