我的java代码中有StackOverflowError问题。我试图检查,似乎我有无限的递归。请告诉我如何解决问题。
public int calculate() {
for (int j = 0; j < len; j++) {
value = calc(0, xstdLen, dataRequest, 1);
}
return value;
}
private int calc(int i, int balance, int[] dataR, int totalLen) {
if (i < len) {
if (balance >= dataR[i]) {
value = calc(i + 1, balance - dataR[i], updArr(dataR, i), totalLen);
} else {
value = calc(i + 1, balance, dataR, totalLen);
}
} else {
for (int k = 0; k < len; k++) {
if (dataR[k] > balance) {
if (dataR[k] == 0) {
value = totalLen;
} else if (dataR[k] > 0) {
value = calc(0, xstdLen, dataR, totalLen + 1);
}
} else {
value = calc(0, balance, dataR, totalLen);
}
}
}
return value;
}
private int[] updArr(int[] dataR, int i) {
if (i > 0) {
}
return dataR;
}
答案 0 :(得分:0)
您的calc()
函数会在if
和else
块中递归调用自身,因此最后一行:return value;
永远不会到达。
递归函数通常需要一个停止条件,最终会实现,因此递归结束。
由于我不知道你想要计算什么,我不知道它究竟应该是什么样子。
但是请尝试更改calc()
功能,使其具有此形式。并确保最终达到停止标准! :
private int calc(int i, int balance, int[] dataR, int totalLen) {
if(\* stopping criterion *\) {
return value;
}
else if(i < len) {
\* your recursive if block*\
} else {
\* your recursive else block*\
}
}
那就是说,你的功能看起来非常性能不好。包含的for循环和调用循环一起已经具有复杂度O(len ^ 2)。随着递归,我认为它至少是O(len ^ 3)。
同样,我不知道你想要实现什么,但在递归函数中使用for循环是非常不寻常的。尝试思考如何在没有循环的情况下解决它。