【发布时间】:2016-05-11 13:06:34
【问题描述】:
这是用于计算数组中反转的 Java 代码。
private void findInversions(int begin, int end, Integer count) {
System.out.println("begin: " + begin + ", end: " + end + ", and count is " + count);
if (end - begin < 1)
return;
int middle = (begin + end) / 2;
findInversions(begin, middle, count);
System.out.println("begin: " + begin + ", end: " + end + ", here count is " + count);
findInversions(middle + 1, end, count);
mergeAndCount(begin, middle, end, count);
System.out.println("begin: " + begin + ", end: " + end + ", count now is: " + count);
}
private void mergeAndCount(int begin, int middle, int end, Integer count) {
int[] result = new int[end - begin + 1];
int aptr = begin;
int bptr = middle + 1;
for (int i = 0; i < result.length; i++) {
if (aptr <= middle && bptr <= end) {
if (numbers[aptr] < numbers[bptr]) {
result[i] = numbers[aptr];
aptr++;
}
else { // numbers[aptr] > numbers[bptr]
// (a[aptr], b[bptr]) is an inversion here
count++;
System.out.println("Found: (" + numbers[aptr] + "," + numbers[bptr] + ") " + count);
result[i] = numbers[bptr];
bptr++;
}
}
else if (aptr > middle) {
result[i] = numbers[bptr];
bptr++;
}
else if (bptr > end) {
result[i] = numbers[aptr];
aptr++;
}
}
for (int i = 0; i < result.length; i++) {
numbers[begin + i] = result[i];
}
}
反转打印得很好,但count 永远不会正确,因为在递归调用返回后它会丢失其值。我已经调试了几次,我所看到的只是当递归结束时count 再次变为 0,但我找不到原因。谁能解释一下?
【问题讨论】:
-
您为什么希望它被保留? Java 对所有内容都使用按值传递,包括对
Integer对象的引用。注意count++会创建一个新的Integer对象;所有 Java 包装器类型都是不可变的。如果您愿意,可以使用AtomicInteger作为可变包装类型... -
Integer类在java中不是不可变的吗?
-
@EmanuelOster 是的。但即使不是这样,它也不会起作用,因为我的回答中有描述。
标签: java recursion pass-by-reference