欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

java 按 n 位组合一组数据 java 写出数字组合

最编程 2024-07-03 10:21:30
...


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的

java 将一组数据进行n位的组合 java写出一组数字的组合_System

完整代码:

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