2013-03-10 97 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