【发布时间】:2019-12-12 04:21:51
【问题描述】:
我正在编写一个程序,它接受一个数字 n 并返回所有可能的组合以将组分成两对。
为此,我使用了一种递归方法,该方法从编号为 1 到 n 的 ArrayList 开始。然后我选择第一个数字并将其与另一个数字匹配,同时删除两者。我使用For 循环将第一个数字与每个其他数字配对,然后我在最后回忆了该方法。因此,除了n-2 之外,它将执行相同的过程,因为我删除了配对号码(存储它们以免丢失)。
我发现这最初是可行的,但是一旦它第一次达到基本情况,当我的程序将方法调用堆栈向下移动到其他递归调用时,存储数字 ArrayList 的局部变量将保持为空 List。
我所指的 ArrayList 称为“数字”。递归方法是createPair。我在下面附上了我的代码:
public static void Combinations(int n){
//store possible numbers that can be chosen
ArrayList<Integer> numbers = new ArrayList<>(n);
//store combinations and pairs
ArrayList<int[]> pairs = new ArrayList<>();
//returns it in the proper form
//int[] value = new int[n];
//reset number
for(int i = 1; i <= n; i++){
numbers.add(i);
}
//do combinations
//n-1, n-3, ... 1 (increments of two)
createPair(pairs, numbers, n);
}
public static void createPair(ArrayList<int[]> pairs, ArrayList<Integer> numbers, int n){
int length = numbers.size();
//base case
if(length == 0){
int[] value = convertPair(pairs, n);
List1.add(value);
return;
}
int[] pair = new int[2];
pair[0] = numbers.get(0);
numbers.remove(0);
for(int i = 0; i < length; i++){
pair[1] = numbers.get(i);
ArrayList<Integer> numbers1 = numbers;
numbers1.remove(i);
pairs.add(pair);
createPair(pairs, numbers1, n);
}
}
//convert to one array value form
public static int[] convertPair(ArrayList<int[]> pairs, int n){
int[] value = new int[n];
for(int i = 0; i < n/2; i++){
int index = pairs.get(i)[1]-1;
int index2 = pairs.get(i)[0]-1;
value[index] = pairs.get(i)[1];
value[index2] = pairs.get(i)[0];
}
return value;
}
另外,我在运行时收到的错误消息(对于n = 8)是
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at wormhole.createPair(wormhole.java:294)
at wormhole.createPair(wormhole.java:300)
at wormhole.createPair(wormhole.java:300)
at wormhole.createPair(wormhole.java:300)
at wormhole.Combinations(wormhole.java:277)
at wormhole.main(wormhole.java:169)`
【问题讨论】:
标签: java recursion combinations