为什么此代码显示StackOverflow错误? 导入java.util.array; 导入java.util.Scanner; 公共类EqualMedian{ 静态整数中值(整数[]a、整数[]b、整数中值、整数[]温度){ 整数计数=0; 如果(a[mid]!=b[mid]){ 温度[0]=a[mid]; a[mid]=b[mid]; b[mid]=温度[0]; 数组。排序(a); 数组。排序(b); 计数++; 中间值(a、b、中间值、温度); } 返回计数; } 公共静态void main(字符串args[])引发异常{ 扫描仪sc=新的扫描仪(System.in); int t=sc.nextInt(); 对于(int j=0;j

为什么此代码显示StackOverflow错误? 导入java.util.array; 导入java.util.Scanner; 公共类EqualMedian{ 静态整数中值(整数[]a、整数[]b、整数中值、整数[]温度){ 整数计数=0; 如果(a[mid]!=b[mid]){ 温度[0]=a[mid]; a[mid]=b[mid]; b[mid]=温度[0]; 数组。排序(a); 数组。排序(b); 计数++; 中间值(a、b、中间值、温度); } 返回计数; } 公共静态void main(字符串args[])引发异常{ 扫描仪sc=新的扫描仪(System.in); int t=sc.nextInt(); 对于(int j=0;j,java,arrays,Java,Arrays,输出:执行失败。堆栈跟踪:线程“main”中出现异常 java.lang.StackOverflowerr位于 java.util.DualPivotQuicksort.sort(DualPivotQuicksort.java:111)位于 java.util.Arrays.sort(Arrays.java:144)位于 等中位数。中位数(等中位数:16) 相等中位数。中位数(相等中位数。java:19) 等中位数。中位数(等中位数。java:19) 相等中位数。中位数(相等中位数。java:1

输出:执行失败。堆栈跟踪:线程“main”中出现异常 java.lang.StackOverflowerr位于 java.util.DualPivotQuicksort.sort(DualPivotQuicksort.java:111)位于 java.util.Arrays.sort(Arrays.java:144)位于 等中位数。中位数(等中位数:16) 相等中位数。中位数(相等中位数。java:19) 等中位数。中位数(等中位数。java:19) 相等中位数。中位数(相等中位数。java:19)


您只需交换a[mid]和b[mid],它们永远不会相等,它将以无限递归调用结束,因此将出现StackOccoverflow错误。

所以您的最终目标是确定两个数组是否具有相等的中值,如果是,打印中值? 您应该创建一种只计算一个数组中值的方法。为main中的每个数组调用此方法。不需要递归

import java.util.Arrays;
import java.util.Scanner;


public class EqualMedian {

    static int median(int[] a, int[] b, int mid, int[] temp) {
        int count = 0;

        if (a[mid] != b[mid]) {
            temp[0] = a[mid];
            a[mid] = b[mid];
            b[mid] = temp[0];

            Arrays.sort(a);
            Arrays.sort(b);
            count++;
            median(a, b, mid, temp);
        }

        return count;
    }

    public static void main(String args[]) throws Exception {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();

        for (int j = 0; j < t; j++) {
            int n = sc.nextInt();
            int a[] = new int[n];
            int b[] = new int[n];

            for (int i = 0; i < n; i++) {
                a[i] = sc.nextInt();
            }

            for (int i = 0; i < n; i++) {
                b[i] = sc.nextInt();

            }

            int[] temp = { 0 };
            int mid = (n / 2) + 1;
            int ans = median(a, b, mid, temp);
            System.out.println(ans);

        }
    }
}
如果没有设置正确的结束条件,则不应使用递归。所以一定要仔细检查你的情况。大多数递归都有一个for/while循环。如果while循环中的条件听起来像是无穷大,那么这可能是个坏主意


此外,如果一个变量可以在本地计算,并且在方法之后没有任何用途(例如
temp
),不要将其作为参数!只需在本地声明即可。

如果
a[mid]
永远不等于
b[mid],则不要在类名中使用
使用驼峰大小写(Java命名约定)
该方法本身调用,那么我能做什么呢?我必须通过交换一个数组的数目和另一个数组的数目,使两个排序数组的中间数相等。思考并验证您的逻辑我使用的逻辑是,我们将交换两个给定数组的中间数并对它们进行排序。然后重复此步骤,直到两个数组的中间数相等为止数组变为相等。但是我对数组a[]和b[]进行排序;我必须使两个排序数组的中间数相等,所以我提出了一个逻辑,我将交换中间的元素,然后再次对它们进行排序。如果我这样做一定次数,我的目标就会实现。@ankit\u vd你在铅笔测试(纸上)中试过吗?实际上,这种逻辑在纸上的某些情况下有效,但在大多数情况下失败了。
public static int median(int []myArray) {
    int mid = (myArray.length() / 2) + 1;
    return myArray[mid]
}

public static void main(String args[]) {
    ...
int firstMedian = median(a);
int secondMedian = median(b);
    if(firstMedian == secondMedian) {
        System.out.println(firstMedian);
    }
}