繁体   English   中英

递归方法中的StackOverflowError

[英]StackOverflowError in Recursive Method

我正在尝试使用递归方法计算给定字符串中出现的字母“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设置为int index和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;
}

String.indexOf开始搜索您提供的索引。 因此,它从索引9开始搜索,并在索引9中找到一个“ e”,因此返回9。

尝试从index + 1开始indexOf。

两点:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM