【问题标题】:Turning a recursion into an iteration in Java?在 Java 中将递归转换为迭代?
【发布时间】:2021-03-11 22:27:10
【问题描述】:

我得到一个堆栈溢出错误,因为我的递归创建了一个无限循环。将方法转换为迭代会阻止这种情况,但我不知道如何!

谁能指导我将递归变成循环?

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

具体是return findEmpty(getNextLocation(startPos, ++stepNum, key), stepNum, key); 导致错误!

【问题讨论】:

  • 如果您的递归代码无限递归,那么它的迭代版本也会如此。
  • 我怀疑问题实际上出在getNextLocation,所以如果没有看到该代码,我们就无法诊断问题。我怀疑以下不是你的问题,但看起来你正在以一种你意想不到的方式使用++stepNum;按照您的方式,stepNum 在每次迭代中都是相同的,并且在 getNextLocation 内部是 stepNum+1
  • 你昨天问了一个几乎相同的问题。它甚至没有关闭。你为什么放弃这个问题而问这个问题?
  • 编辑不得使现有答案无效。如果需要,请提出新的后续问题,并附上此问题的链接!具体来说,您的revision 3 是一个很好的候选人;毫无疑问,它会吸引到具体的答案。较新的修订版询问完全不同的代码,因此值得另外发表一篇文章。 :)
  • 我明白了,谢谢! @WillNess

标签: java arrays recursion iteration hashtable


【解决方案1】:

您的递归调用处于尾部位置。因此它已经描述了一个循环。只需要在语法上明确说明:

private int findEmpty(int startPos, int stepNum, String key) {
  while( True ) 
  {
    if (arr[startPos] == null) {
        return startPos;
    }
    // return findEmpty(getNextLocation(startPos, ++stepNum, key), stepNum, key);
    ++stepNum;
    int nextPos = getNextLocation(startPos, stepNum, key);
    // return findEmpty(nextPos, stepNum, key);
    startPos = nextPos;
  }
}

我不会用 Java 编写代码。以上代码如有任何不合规之处,请将其视为伪代码,改成合适的。

【讨论】:

  • 没关系,尽管改变函数的参数是不习惯的。但是,这可以通过在循环开始之前将值移动到辅助变量中然后对其进行变异来轻松规避。
猜你喜欢
  • 2016-01-26
  • 2017-03-05
  • 1970-01-01
  • 2019-10-10
  • 2016-06-29
  • 1970-01-01
相关资源
最近更新 更多