JAVA数字组合

这篇博客介绍了一种使用二叉树方法解决JAVA中数字组合问题的递归思路。通过设置箭头并根据箭头位置更新数组,博主详细解释了如何生成所有可能的组合,例如n=5,r=3时的所有组合。代码实现包括两条递归调用来遍历左子树和右子树,并在箭头到达第一个数时通过设置特殊值避免进一步递归。

JAVA数字组合题目
//下附完整代码
题目:
#排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。
现要求你用递归的方法输出所有组合。
例如n=5,r=3,所有组合为:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5

这里我的思路是用二叉树的方法实现
先输出再递归,
//g代表箭头指在第几个数

       zh[g] = zh[g] + i;
        for (int j = 1; j <= y; j++)
        { System.out.print(zh[j]);}
         System.out.println();

箭头定在第3个数字,这个数又不能等于后一个数,所以如果箭头这个数<(后一位数-1)就让箭头这个数+1,但是一开始的数组是从zh[[1]]开始就是12345,第3个数后面是4这样论下去是到不了125的,所以我让第4个数等于最后一个数再+1。即数组从zh[[1]]开始为{1,2,3,6,5}
用两条递归调用语句实现
第一条递归:
如果箭头所在数<(后一个数-1),就让箭头所在的数+1然后调用自己输出数组的1到3,也就是124,再执行一次箭头数+1输出125,
就相当于是输出左子树
//g代表箭头指在第几个数

         if (zh[g] < zh[g + 1] - 1)//g代表箭头指在第几个数
            递归(zh, x,y, 1, g);

这时候箭头上的数是5已经不满足if语句里的条件了就到了第二条递归:
如果箭头前一个数小于箭头这个数就让箭头指向前一个数就是下图中的(g-1),因为g就代表箭头指的第几个数。调用自己再将箭头指的数+1输出来就是135。
然后135又重复第一条递归:如果箭头所在数<(后一个数-1),就让箭头所在的数+1然后调用自己输出数组的1到3
就相当于右子树

           if (zh[g - 1] < zh[g] - 1)
            递归(zh,x, y, 1, g - 1);

当箭头指向第1个数时就不能再往前了,再往前就是zh[0]了所以我让zh[0]=99;让它条件不成立结束语句;


        int x = a.nextInt();//输入总数   //输入5
        System.out.print("输入抽取个数:"); 
        int y = a.nextInt();//输入抽取个数  //输入3
         System.out.println("组合数为" + cs + "个");
        int zh[] = new int[x + 1];
        zh[0] = 99;
        for (int i = 1; i <= x; i++) {
            zh[i] = i;
        }
        zh[y + 1] = zh[x] + 1; //x是等于5,y是等于3的

在这里插入图片描述

完整代码:

    public static void main(String[] args) {
        Scanner a = new Scanner(System.in);
        int cs;
        System.out.print("输入总数:");
        int x = a.nextInt();//输入总数
        System.out.print("输入抽取个数:");
        int y = a.nextInt();//输入抽取个数
        int zh[] = new int[x + 1];   //创建数组
        zh[0] = 99;
        for (int i = 1; i <= x; i++) { //数组1到x赋值
            zh[i] = i;
        }
        zh[y + 1] = zh[x] + 1;   //让箭头后一个数等于最后一个数+1
        int g = y;   //定义光标指在第几个数
        递归(zh,x, y, 0, g); //一开始传入的i=0因为一开始就要输出123所以不用+1之后就一直传i的值为1因为要进行箭头指的数+1的操作
    }

    public static void 递归(int[] zh,int x, int y, int i, int g) {
              zh[g] = zh[g] + i;  //将箭头所指的数+1
        for (int j = 1; j <= y; j++)
        { System.out.print(zh[j]);}
         System.out.println();

        int zh2[]=new int[x+1];  //这里创建一个新的数组来存放上面传进来的数组给第二条递归语句用
        zh2[0]=99;      //以输入x=5,y=3为例,如果不用新数组存放,就会导致之后传给第二条递归语句的数都是345,输出不了234和134
        for (int k=1;k<=y;k++){
            zh2[k]=zh[k];
        }

        if (zh[g] < zh[g + 1] - 1)  //第一条递归,相当于左子树
            递归(zh, x,y, 1, g);
        if (zh2[g - 1] < zh2[g] - 1) //第二条递归,相当于右子树
            递归(zh2,x, y, 1, g - 1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值