我已经为我的作业编写了以下方法:分而治之:
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矩阵,但对于n> = 10的矩阵,它会导致java.lang.StackOverflowError 而这似乎是因为这种方法中的函数调用。我测试每个矩阵有n行和n列,递归方法被称为n n次。这是例外的原因吗?我该如何解决?我已经用迭代编写了上面的方法并且它正常工作但是我应该用分而治之的方法编写这个方法,我努力但我不知道如何解决问题。
答案 0 :(得分:3)
或者:
增加VM的堆栈大小
重写您的代码,以便减少递归调用。它不像一样就像它正在做一些你真正需要在矩阵的每个单元格上进行递归的东西,而不仅仅是在大小为NxN到1x1的矩阵上?
完全消除递归。您可以使用循环和自己的堆栈管理重写任何递归函数。