2

我正在尝试使用递归方法计算字母“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。如何解决这个问题?

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

2 回答 2

7

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

尝试从 开始 indexOf index + 1

于 2013-03-10T00:14:22.673 回答
0

两点:

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

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

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

于 2013-03-10T00:29:13.247 回答