使用java递归来完成一个n位数的数组用m个数拼接没有重复

public static void main(String[] args) {
int[] a = new int[]{1,2,3,4,5,6};//原来的元素
int m = 3;//组合元素数量
int result[] = new int[m];//保存结果
show(a,0, result, m,result.length, a.length);
}

// 如果是输出3位数 ,循环的次数就是5+1-33,循环3次
// 如果是输出4位数,循环次数就是5+1-4
2,循环2次
// 因为,5位数里面,如果要输出4位数,并且不重复的话
// 只能由第一位数和第二位数开头,,,,
//
// 现在模拟输出3位数
// 循环的次数就是5+1-3==3,循环3次
// 第一次循环刚开始的地点是0,result的最后一个数字也就会是0
// 所以,result现在指示下标位置是3-1.。
// i现在是第一个循环,所以是0,所以result最后一个是0
// 判断了一下,result如果下标到达了第一位数,就输出,,
// 可是到现在result还没有到达第一位数,所以,进入下一个递归
// 递归后,开始下标是+1了,所以是1开始,也就是数组的第二个开始下标,需要组合的数字也就-1,变成了2
// 所以,顶上的循环就会是从数组的第二个开始循环到数组长度(5)+1-(要组合的数字)2=4
// 所以,result现在指示下标位置是2-1.。
// i现在是第一个循环,所以是1,所以result最后一个是1
// 判断了一下,result如果下标到达了第一位数,就输出,,
// 可是到现在result还没有到达第一位数,所以,进入下一个递归
// 递归后,开始下标是+1了,所以是2开始,也就是数组的第三个开始下标,需要组合的数字也就-1,变成了1
// 所以,顶上的循环就会是从数组的第三个开始循环到数组长度(5)+1-(要组合的数字)1=5
// 所以,result现在指示下标位置是1-1.。
// i现在是第一个循环,所以是2,所以result最后一个是2
// 判断了一下,result如果下标到达了第一位数,就输出,,
// 现在result的指标已经达到了第一位数,
// 所以需要输出,,
// a[result[2,1,0]]=a[0]+a[1]+a[2]
// 输出了之后,开始这次的第二的循环,本来这个i的循环开始是2,下一个循环后这个i变成是3
// 覆盖result的第一个数字,也就是说是3,
// 然后判断,result的指标还是第一位,进入
// 然后输出倒序输出result数组里面的数字a[0]+a[1]+a[3]
// 。。。。。就这样省略n字。。。。。。
// 等到顶循环已经到达终点(5)时。。此递归已经结束。。回到上一个递归
//
// 递归结束后,继续上一个递归的循环,上一个递归的值完全没有变化,
// 顶层循环进入了下一个循环i++=2
// 就是第二个循环
// count也没有变化,还是2
// 然后i的第2-1的地方是循环里面的i:2
// 所以判断count下标不是1之后
// 开始递归,
// 省略n字
// 递归完毕后
// 上一层递归数据照样不变
// 开始下一层循环。。i++=3
// 然后i的第2-1的地方是循环里面的i:3
// 所以判断count下标不是1之后
// 进入递归。。
// 省略n字退出递归
// 递归数据照样不变。。。
// 省略n字
// 等到这个count值为2的递归顶循环完毕之后
// 会退出此递归
// 回到上层递归
// 数据不变,
// 进入下一次顶循环
// 省略n字、、、、、

//arr为原始数组
//start为遍历起始位置
//result保存结果,为一维数组
//count为result数组的索引值,起辅助作用
//num为要选取的元素个数
//arr_len为原始数组的长度,为定值
static void show(int [] arr, int start, int [] result, int count, int num,int arr_len){//

    //最大一循环:从起始位置开始循环到原数组长度+1再减去保存结果的数组长度
    //详解:从开始循环到数组最后,然后+1,然后减去count
       for (int i = start; i < arr_len + 1 - count; i++){//count如果是3,最后的地方肯定是多两位数

           //而这两位数后面已经不能组合了,所以不需要
           //进入第二次递归的时候,count会变成2,所以用这样算出到2位数
           //进入第三次递归的时候,count就变成1了,所以,用这样算出到1位数
           //把暂存数组的第count数修改成i
           //每次递归会把count-1,下面的判断会判断count如果=0就进入,输出内容,所以这个是长度,
           //递归后,
             result[count - 1] = i;//如果result里面有5个限制,先给最后面的赋值
           //判断如果count-1=0就进入
           //如果count=1的话也就是说数组长度

            if (count - 1 == 0){//如果count-1=0就进入//进入一次就输出一次
                  for (int j = num - 1; j >= 0; j--){//循环输出num位数的j
                      //输出的内容是原数组的result数组里面的倒过来输出
                      System.out.print(arr[result[j]]);
                  }//循环输出完毕之后换行
                     System.out.println("");
                 }else{//count-1不等于0//进入递归
                //进入递归后
                //每次进入递归后开始循环的开始地点就会+1
                show(arr, i + 1, result, count - 1,num, arr_len);//一次递归开始重新开始
                //离开递归后
            }
           }
     }

猜你喜欢

转载自blog.csdn.net/qq_42903710/article/details/85795769
今日推荐