OptimumRequest:StackOverflowError

时间:2016-02-07 09:26:59

标签: java

我的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;
}

1 个答案:

答案 0 :(得分:0)

您的calc()函数会在ifelse块中递归调用自身,因此最后一行: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循环是非常不寻常的。尝试思考如何在没有循环的情况下解决它。