2013-03-10 100 views
2

我想要一个递归方法计算给定字符串中出现多少个字母“e”的实例。我的测试字符串是Count my e's please!。这是迄今为止代码:递归方法中的StackOverflowError

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将返回到主方法。但是,调试表明int i将通过每次调用导致StackOverflowError设置为9。如何解决这个问题?

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

几乎总是问题与停止条件。 – 2013-03-10 00:13:50

+0

为什么你使用递归方法呢? – Rob 2013-03-10 00:14:39

+0

@Rob:我假设OP正在尝试递归,因为循环会更容易理解。 – Ash 2013-03-10 00:15:43

回答

7

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

尝试从index + 1开始indexOf。

+0

+1,但现在结果将是* e的数量+ 1 *(对于'abcde',它将返回2而不是1)。所以现在返回应该是'return count - 1;' – Maroun 2013-03-10 00:16:05

+0

@MarounMaroun不,count'本身没有改变,只是搜索的起始索引。 – 2013-03-10 00:18:30

+0

事实上,我最初编写的程序有'index + 1'。我想我解开了它试图解决另一个错误的争夺战。赞美你,并在同一时间踢自己。非常感谢。 – rice2007 2013-03-10 00:19:49

0

两点:

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

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

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

+0

这是我尽可能远离递归的具体原因,但正如我刚才所说的,我最近一直在这个dang递归踢。我会尝试这个2争论的挑战。如果你再看到我,我已经成功了。 – rice2007 2013-03-10 00:35:43

+0

我想我已经想出了一个只有两个参数进行调用的方法。我实际上正在研究第三种解决方案以避免所有递归。请有一个看看和2参数,递归解决方案。请参阅编辑问题以获取答案。 – rice2007 2013-04-02 19:35:40