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

        }
    }
}

輸出:執行失敗。 堆棧跟蹤:線程“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 錯誤。

所以你的最終目標是確定 2 個數組的中位數是否相等,如果是,打印中位數? 您應該創建一種僅計算一個數組的中位數的方法。 為 main 中的每個數組調用此方法。 不需要遞歸。

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

如果沒有設置適當的結束條件,則不應使用遞歸。 所以..總是仔細檢查你的狀況。 大多數遞歸都有一個等效的 for/while 循環。 如果 while 循環中的條件聽起來像是無窮大,那可能是個壞主意。

此外,如果變量可以在本地計算並且在方法之后沒有任何作用(例如temp ),請不要將其設為參數! 只需在本地聲明即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM