簡體   English   中英

遞歸方法中的StackOverflowError

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM