我试图在不使用递归的情况下显示所有组合。 我试着用循环但是它没有工作。
没有递归(不工作):
import java.util.Arrays;
public class Combination {
public static void main(String[] args) {
String[] arr = {"A","B","C","D","E","F"};
String[] result = new String[3];
int i = 0, len = 3;
while(len != 0 || i <= arr.length-len)
{
result[result.length - len] = arr[i];
len--;
i++;
}
if (len == 0){
System.out.println(Arrays.toString(result));
return;
}
}
}
使用递归(工作):
import java.util.Arrays;
public class Combination {
public static void main(String[] args){
String[] arr = {"A","B","C","D","E","F"};
combinations2(arr, 3, 0, new String[3]);
}
static void combinations2(String[] arr, int len, int startPosition, String[] result){
if (len == 0){
System.out.println(Arrays.toString(result));
return;
}
for (int i = startPosition; i <= arr.length-len; i++){
result[result.length - len] = arr[i];
combinations2(arr, len-1, i+1, result);
}
}
}
我做错了什么?
答案 0 :(得分:1)
目前尚不清楚你想要得到的答案是什么。应该使用示例数据设置问题,以准确指定您想要获得的内容。鉴于您提供的计划的一部分。我想你要找的是所有可能的子集。
以下代码将为您提供所有可能的子集。您可以轻松修改此程序,为您提供所有可能的特定大小的子集(尝试它以确保您了解它的工作原理)。
static void subsets(String[]arr) {
int len = arr.length;
for (int i = 0; i < (1 << len); i++) { // 1 << len means 2 ^ len there are 2 ^ n subsets for a set of size n
/*
* We will use the bits of the integer i to represent which elements are taken
* a bit of value 1 means this element is included in the current subset
* a bit of value 0 means that we do not take the element in the given position
*/
String res = "[";
for(int j = 0; j < len; j++) { //loop over the bits of i from 0 to len -1
if ( (i & (1 << j)) != 0) {
//the jth bit is 1 in the integer i as such the jth
//element is taken in the current subset
res += (arr[j]+", ");
}
}
res += "]";
int lastCommaPosition = res.lastIndexOf(',');
if (res.lastIndexOf(',') != -1) { // a comma exists
res = res.substring(0, lastCommaPosition)+ "]";//remove the extra comma and space
}
System.out.println(res);
}
}
您可以修改上面的方法以获取整数大小,例如,如果此计数等于您打印的大小,则计算值1的位数(所采用的元素数),否则您不会。如果这不是您想要的答案,请随意修改问题,或者如果您不理解某些内容,请在评论中提出。
答案 1 :(得分:-1)
以下是如何在没有递归的情况下获得准确的输出。我正在使用for循环:
for(int i = 0; i < arr.length - 2; i ++) {
for(int j = i + 1; j < arr.length - 1; j++ ) {
for(int k = j + 1; k < arr.length ; k++ ) {
System.out.println(arr[i] + ", " + arr[j] + ", " + arr[k]);
}
}
}