【问题标题】:StackOverFlow error recursionStackOverFlow 错误递归
【发布时间】:2014-12-15 21:42:36
【问题描述】:

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

从 startPos(key 的哈希值)开始,每次递增 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;
    }

感谢任何建议或批评。

【问题讨论】:

  • 你试过调试吗?您可以在findEmpty 的开头打印实际参数,这样您就会知道它为什么不能正确退出。

标签: java recursion hashtable


【解决方案1】:

如果整个数组的 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);
}

此外,您必须有一种方法来检测数组何时已满,在这种情况下您应该重新调整它的大小或抛出异常。

【讨论】:

  • 它检查它是否为 == null 而不是 !=
  • @user3463583 是的,如果arr[startPos] == null 您从该方法返回而不进行递归调用,那么一切都很好。问题是它永远不会为空,所以你总是进行递归调用,直到你得到堆栈溢出。
  • 啊,我明白你的意思了。谢谢!
猜你喜欢
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 2017-10-04
相关资源
最近更新 更多