[英]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.