递归方法中的StackOverflowError

时间:2013-03-10 00:09:27

标签: java string recursion

我正在尝试使用递归方法计算给定字符串中出现的字母“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方法。但是,调试显示通过每次调用导致StackOverflowError将int i设置为9。怎么解决这个问题?

编辑:这是响应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;
}

2 个答案:

答案 0 :(得分:7)

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

尝试在index + 1开始使用indexOf。

答案 1 :(得分:0)

两点:

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

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

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