2010-12-22 100 views
0

可能重复:
Stack overflows from deep recursion in Java?如何解决这个java方法中的stackoverflow异常?

我写了下面的方法与分而治之于我的任务:

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; 

} 

此方法适用于一个n矩阵,但对于n> = 10的矩阵,它会导致java.lang.StackOverflowError 而它似乎是b因为这种方法中的函数调用。我对n行n列的每个矩阵进行了测试,递归方法被称为n n次。这是例外的原因吗?我该如何解决它?我已经用迭代方法编写了上述方法,但它的工作原理正确,但我应该用分而治之写出这个方法,我努力尝试,但我不知道如何解决这个问题。

+0

令人毛骨悚然的代码http://stackoverflow.com/questions/4484874/fill-half-of-a-matrix-with-java而且我仍然不知道OP究竟是在尝试做什么。 – 2010-12-22 16:52:35

回答

3

或者:

  1. 增加您的VM

  2. 的堆栈大小,让你少做递归调用

    重写代码。它不是看起来就像它正在做某些事情,你真的需要在矩阵的每个单元上进行递归,而不仅仅是在NxN到1x1的矩阵上?

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

+0

你会请扩大secon指南多一点? – 2010-12-22 16:51:58

相关问题