【问题标题】:how to solve stackoverflow exception in this java method? [duplicate]如何解决这个java方法中的stackoverflow异常? [复制]
【发布时间】:2011-05-29 12:31:53
【问题描述】:

可能重复:
Stack overflows from deep recursion in Java?

我为我的作业编写了以下分而治之的方法:

calculateC(cMatrix, cMatrix.length - 1, cMatrix.length - 1, w);
    for(int i = cMatrix.length - 2 ;i>=0; i--)
        calculateC(cMatrix, i, i+1, w);

private static double calculateC(double[][] matrix,
    int i,
    int j,
    double[][] w){
    o++;
    double x1 = 0;
    double x2 = 0;
    double result = 0;
    if(i > j) result = 0;
    if(i == j){
        matrix[i][j] = w[i][j];
        result = w[i][j];

    }

    else if(i <= j){

        for(int k = i; k <= j; k++){

            if(i > k - 1)
                x1 = 0;
            else if(i <= k - 1){

                if(matrix[i][k - 1] != 0){
                    x1 = matrix[i][k - 1];
                } else{
                    x1 = calculateC(matrix, i, k - 1, w);

                }
            }
            if(k + 1 > j)
                x2 = 0;
            else if(k + 1 <= j){

                if(matrix[k + 1][j] != 0){
                    x2 = matrix[k + 1][j];

                } else{
                    x2 = calculateC(matrix, k + 1, j, w);
                }
            }

            cs.add(x1 + x2);
            ks.add(k);
        }
        addMin(matrix, i, j, cs, ks, w);
    }

    if(j >= 0 && i >= 0 && j < matrix.length - 1){

        calculateC(matrix, i, j + 1, w);
    }

    return result;

}

此方法适用于 nn 矩阵,但对于 n>=10 的矩阵,它会导致 java.lang.StackOverflowError 而且似乎是因为这个方法中的函数调用。我对具有 n 行和 n 列的每个矩阵进行测试,递归方法被调用 n 次。是异常的原因吗?我该如何解决?我用迭代写了上面的方法,它工作正常,但我也应该用分而治之的方法写这个方法,我很努力,但我不知道如何解决这个问题。

【问题讨论】:

标签: java stack-overflow


【解决方案1】:

要么:

  1. 增加 VM 的堆栈大小

  2. 重写代码以减少递归调用。它看起来不像是在做一些你真正需要在矩阵的每个单元上递归而不是仅仅在大小为 NxN 到 1x1 的矩阵上的事情?

  3. 完全消除递归。您可以使用循环和自己的堆栈管理重写任何递归函数。

【讨论】:

  • 能否请您再解释一下第二指南?
  • 我已将 Eclipse 中的堆大小增加到 -Xmx512m,但仍然会导致相同的异常。我应该增加更多吗?
猜你喜欢
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多