[C趣味编程]从a个数中取b个数的无重组合(C(b,a)算法的递归实现和循环实现)...

 

  C(b,a)表示从a个数中取b个数的无重组合,是高中数学概率的知识。

 

以下使用“递归方式”和“循环方式”,实现这个算法。很明显,循环的实现很简单,但是缺点是需要b是已知的才行,因为b的大小决定了for循环的个数。

 

public class C_Hanshu {

    public static void main(String[] args) {
        // 递归方式
        C(new int[]{1,2,3,4,5,6,7,8,9,10},3);
        System.out.println("----------------------------");
        // 循环方式
        C_for();
    }

    /**
     * 递归方式:实现从a数组中,取b个元素的所有不同结果。<br>
     * 可以视为c(b,a)。
     */
    static int count = 0;
    public static void help(int a[], int b,int begin,int index,int result[]) {
        for(int i =begin;i<a.length;i++){
            result[index] = a[i];
            if(index < b-1){
                help(a,b,i+1,index+1,result);
            }else{
                //输出result
                System.out.print( "["+(++count)+"]");
                for(int e:result)System.out.print(e+" ");
                System.out.println();
            }
        }
    }
    public static void C(int a[], int b ) {
        int[] result = new int[b];
        help(a, b, 0, 0, result);
    }
//-------------------------------------------------------------------
    /**
     * 循环方式:实现从10个元素的a数组中,取3个元素的所有不同结果。<br>
     * 可以视为c(3,10)=(10*9*8)/(3*2*1)=120种。
     */
    public static void C_for() {
        int a[] = {1,2,3,4,5,6,7,8,9,10};
        int result[] = new int[3];
        int count = 0;
        for (int i = 0; i <= 7; i++) {
            result[0] = a[i];// 第一个数
            for (int j = i + 1; j <= 8; j++) {
                result[1] = a[j];// 第二个数
                for (int k = j + 1; k <= 9; k++) {
                    result[2] = a[k];// 第三个数
                    System.out.println("["+(++count)+"]"+result[0]+" "+result[1]+" "+result[2]);//列举完3个数,则完成一次列举
                }
            }
            
        }
    }

}
 

 

 

效果:

 

[1]1 2 3
[2]1 2 4
[3]1 2 5
[4]1 2 6
[5]1 2 7
[6]1 2 8
[7]1 2 9
[8]1 2 10
[9]1 3 4
[10]1 3 5
[11]1 3 6
[12]1 3 7
[13]1 3 8
[14]1 3 9
[15]1 3 10
[16]1 4 5
[17]1 4 6
...
[117]7 8 9
[118]7 8 10
[119]7 9 10
[120]8 9 10
----------------------------
[1]1 2 3
[2]1 2 4
[3]1 2 5
[4]1 2 6
[5]1 2 7
[6]1 2 8
[7]1 2 9
[8]1 2 10
...
[118]7 8 10
[119]7 9 10
[120]8 9 10

 

 

 

 

--EOF--

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值