【问题标题】:StackOverflowError in Recursive Method递归方法中的 StackOverflowError
【发布时间】:2013-02-25 09:07:04
【问题描述】:

我正在尝试使用递归方法计算字母“e”出现在给定字符串中的实例数。我的测试字符串是Count my e's please!。到目前为止的代码如下:

public static int showE(String s, int count, int index)
{
        if (index == -1) return count;
        String e = "e";
        int i = s.indexOf(e, index);
        if (i != -1) count ++;
        return showE(s, count, i);
}

当我调试代码时,int i 将保持在 9,而不是在每次调用中增加。

我认为由于最后一行代码使用int i 作为输入,它会在每次调用测试字符串时将方法签名中的int index 设置为9、15 和18。一旦不再检测到字母 e,我认为 int i 会将 -1 发​​送到签名,然后 int count 将返回给 main 方法。但是,调试表明 int i 将通过每次调用设置为 9,从而导致 StackOverflowError。如何解决这个问题?

编辑:这是响应 Stephen C 的代码。对格式表示抱歉:

public static int showE(int count, int index)
{
        String e = "e";
        index = s.indexOf(e, 0)
        for(int i = index; i = < s.length() - 1; i++)
        {
            if (index == e) count++;
        }
        return count;
}

【问题讨论】:

  • 问题几乎总是与停止条件有关。
  • 你为什么要使用递归方法呢?
  • @Rob:我认为 OP 正在尝试递归,因为循环会更容易理解。
  • @Rob,我选择目前感觉自然的方式。它通常是循环,但我今天一直在递归。

标签: java string recursion


【解决方案1】:

String.indexOf 在您提供的索引处开始搜索。所以它从索引 9 开始搜索,并在那里找到一个 'e',所以返回 9。

尝试从index + 1 开始 indexOf。

【讨论】:

  • +1,但现在结果将是 e 的数量 + 1(对于 abcde,它将返回 2 而不是 1)。所以现在返回应该是return count - 1;
  • @MarounMaroun 不,count 本身没有改变,只是搜索的起始索引。
  • 其实我最初是用index + 1写的程序。我想我在试图修复另一个错误的过程中解开了它。在赞美你的同时踢我自己。非常感谢。
  • 你是对的,我的错。我在此修复之前更改了代码:)
  • 以“e”开头的字符串仍然存在问题。您必须首先使用小于 -1 的索引调用例程。所以用 -2 调用有效,但 -1 或 0 无效。
【解决方案2】:

两点:

  • 对于这个问题,有一个更优雅的递归解决方案,它只需要 showE 方法中的 2 个参数。 提示:考虑在递归调用的结果中添加一些东西...

  • Java 中问题的递归解决方案有一个固有的问题。 Java 堆栈总是有限的,Java 没有实现尾调用优化。将这两者结合起来,任何需要真正深度递归的问题都不可避免地会导致堆栈溢出。

    在这种情况下,这意味着如果您尝试在足够长的字符串中计算 E,您将得到一个异常......即使您得到正确的递归。

【讨论】:

  • 这是我尽可能远离递归的具体原因,但正如我之前所说,我最近一直在进行递归。我将尝试这 2 个参数挑战。如果你再次见到我,我就成功了。
  • 我想我已经找到了一种只用两个参数进行调用的方法。我实际上正在研究第三种解决方案,以避免一起递归。请看一下和 2 参数,递归解决方案。请参阅问题编辑以获取答案。
猜你喜欢
  • 2014-07-07
  • 2021-03-22
  • 2014-02-03
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
相关资源
最近更新 更多