StackOverFlow错误递归

时间:2014-12-15 13:36:49

标签: java recursion hashtable

任务已设置为在自定义哈希表中使用递归方法来查找数组中的下一个可用位置以存储键和值。

从startPos开始(这是键的散列值),并且每次都递增stepNo 跟踪这个地方,如果它被占用我有一个方法来找到下一个位置,具体取决于探测器类型/到目前为止采取的步骤数。出于某种原因,我遇到过流错误。

private int findEmpty(int startPos, String key, int stepNum) {
        if(arr[startPos] == null)
            return startPos;

        int next = getNextLocation(startPos, stepNum++, key);
        findEmpty( next ,key, stepNum);

        return startPos;
    }

以下方法根据其探测类型查找要检查的下一个位置,它采用startPos(键的哈希值)stepNo(跟踪散列后的步骤)和键自身。

private int getNextLocation(int startPos, int stepNum, String key) {
        int step = startPos;
        switch (probeType) {
        case LINEAR_PROBE:
            step++;
            break; 
        case DOUBLE_HASH:
            step += doubleHash(key);
            break;
        case QUADRATIC_PROBE:
            step += stepNum * stepNum;
            break;
        default:
            break;
        }
        return step % max;
    }

感谢任何建议或批评。

1 个答案:

答案 0 :(得分:2)

如果整个数组arr[startPos]!= null(即数组已满),则递归将永远不会结束。

此外,您对递归all - findEmpty( next ,key, stepNum)返回的值不执行任何操作。我假设您想要返回它而不是总是返回startPos

您可能想要进行此更改:

private int findEmpty(int startPos, String key, int stepNum) 
{
    if(arr[startPos] == null)
        return startPos;

    int next = getNextLocation(startPos, stepNum++, key);
    return findEmpty( next ,key, stepNum);
}

此外,您必须有办法检测阵列何时已满,在这种情况下,您应该重新调整大小或抛出异常。