简体   繁体   English

为什么此代码显示 StackOverflow 错误?

[英]Why this code is showing StackOverflow error?

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);

        }
    }
}

OUTPUT: Execution failed.输出:执行失败。 Stack Trace: Exception in thread "main" java.lang.StackOverflowError at java.util.DualPivotQuicksort.sort(DualPivotQuicksort.java:111) at java.util.Arrays.sort(Arrays.java:144) at Equal_median.median(Equal_median.java:16) at Equal_median.median(Equal_median.java:19) Equal_median.median(Equal_median.java:19) at Equal_median.median(Equal_median.java:19)堆栈跟踪:线程“main”中的异常 java.lang.StackOverflowError at java.util.DualPivotQuicksort.sort(DualPivotQuicksort.java:111) at java.util.Arrays.sort(Arrays.java:144) at Equal_median.median(Equal_median) .java:16) 在 Equal_median.median(Equal_median.java:19) Equal_median.median(Equal_median.java:19) 在 Equal_median.median(Equal_median.java:19)

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

So your final goal is to determine if 2 arrays have equal median, and if so, print the median?所以你的最终目标是确定 2 个数组的中位数是否相等,如果是,打印中位数? You should make a method that computes the median for only one array.您应该创建一种仅计算一个数组的中位数的方法。 Call this method for each array in main.为 main 中的每个数组调用此方法。 No need for recursion.不需要递归。

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);
    }
}

Recursion should not be used without setting proper ending conditions.如果没有设置适当的结束条件,则不应使用递归。 So.. always double-check your condition.所以..总是仔细检查你的状况。 Most recursions have a for/while loop equivalent.大多数递归都有一个等效的 for/while 循环。 If the condition in a while loop sounds like it will go to infinity, it's probably a bad idea.如果 while 循环中的条件听起来像是无穷大,那可能是个坏主意。

Also, if a variable can be computed locally and serves no purpose after the method (such as temp ), don't make it a parameter!此外,如果变量可以在本地计算并且在方法之后没有任何作用(例如temp ),请不要将其设为参数! Just declare it locally.只需在本地声明即可。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM