Java 递归方法中的StackOverflower错误

Java 递归方法中的StackOverflower错误,java,string,recursion,Java,String,Recursion,我尝试使用递归方法计算字母“e”在给定字符串中出现的实例数。我的测试字符串是请数一数我的e。以下是迄今为止的代码: 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 ++;

我尝试使用递归方法计算字母“e”在给定字符串中出现的实例数。我的测试字符串是
请数一数我的e。以下是迄今为止的代码:

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);
}
当我调试代码时,
inti
将保持在9,而不是通过每次调用增加

我认为,由于最后一行代码使用
inti
作为输入,它将通过对测试字符串的每次调用,将方法签名中的
intindex
设置为9、15和18。一旦不再检测到字母e,我认为
int I
将向签名发送-1,然后
int count
将返回到main方法。然而,调试表明,
inti
将通过每次调用设置为9,从而导致StackOverflower错误。如何解决这个问题

编辑:这是回应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;
}
公共静态整数显示(整数计数、整数索引)
{
字符串e=“e”;
索引=s.indexOf(e,0)
for(inti=index;i=
从您提供的索引开始搜索。它从索引9开始搜索,在那里找到一个“e”,然后返回9

尝试在
索引+1处启动indexOf

两点:

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

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

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


  • 问题几乎总是出在停止条件上。为什么要使用递归方法来解决这个问题?@Rob:我想OP是在尝试递归,因为循环更容易理解。@Rob,我现在用的是感觉自然的方法。它通常是循环,但我今天一直在进行递归踢击。+1,但现在结果将是e的数目+1(对于
    abcde
    它将返回2而不是1)。所以现在返回应该是
    returncount-1
    @marounnaroun不,
    count
    本身没有改变,只是搜索的起始索引。事实上,我最初是用
    index+1
    编写程序的。我想我在混乱中解开了它,试图修复另一个错误。赞美你的同时也踢我自己。非常感谢。你是对的,我错了。在此修复之前我更改了代码:)以“e”开头的字符串仍然存在问题。最初必须使用小于-1的索引调用例程。因此,使用-2调用是可行的,但是-1或0将不起作用。这就是我在可能的情况下尽量远离递归的具体原因,但正如我前面所说的,我最近一直在使用这种该死的递归方法。我将尝试这2个论点的挑战。如果你再见到我,我已经成功了。我想我已经找到了一个方法,只需要两个参数就可以完成这个调用。我实际上正在研究第三种解决方案,以避免递归。请看一看和2参数,递归解决方案。请参见问题的编辑以获取答案。