2014-02-27 100 views
1

對於遞歸方法的這部分,我需要處理大於2的偶數長度字符串(如我的基本情況所示)。我的問題是搞清楚如何讓我的遞歸案件實際上接近我的基本情況。我不知道我是否正確地執行了反轉部分,因爲基本情況從未被擊中,所以我得到堆棧溢出錯誤。 這是有問題的方法。 (我會在我目前的if語句之後處理奇數字符串,因爲我現在有「return null」,所以我可以在沒有奇數的情況下測試我的例子)。示例輸出:EBCDAF使用遞歸來反轉字符串的索引

public static String revEven(String inString) 
    { 
     String tempString = new String(); 

     if (inString.length() <= 2) 
     return inString; 
     if (inString.length() == 3) 
     { 
     tempString += inString.charAt(2); 
     tempString += inString.charAt(1); 
     tempString += inString.charAt(0); 

     return tempString; 
     } 
     if (inString.length() % 2 == 0) 
     { 
     return revEven(inString.substring(0, inString.length() - 1) + inString.charAt(inString.length() - 1)); 
     } 
     return null; 
    } 
+0

「......我得到一個堆棧溢出錯誤。」 - 哦,不要試圖甜現在我們談談... – aliteralmind

+0

哈哈,我希望我是。我明白爲什麼我會收到錯誤。我試圖接近基本案例的一切都比我目前的解決方案更不明智。 – coinbird

+0

最後一個return語句中的java.lang.StackOverflowError。不過,我確實這麼說。我還說我明白了爲什麼會發生。這是因爲我輸入遞歸方法的字符串永遠不會變小,所以它從不碰到基本情況,導致我的方法永遠調用它自己。 – coinbird

回答

1

爲什麼你的StackOverflowError是您的字符串不遞歸調用之間變化的原因。在你再次調用該函數的行中,只需重新創建初始字符串即可。

「ABCD」=「ABC」(substring(0,3))+「D」(charAt(3)) - 同一個字符串。

提示。不要試圖在遞歸調用中更改字符串。 也許最好是將你的字符串表示爲字符數組,然後在遞歸調用中更改索引,然後交換偶數索引指向的字符。

我沒有檢查角落案件,但下面的想法是:

public static String runEven(String string) { 
    char[] array = runEvenImpl(string.toCharArray(), 0, string.length()); 
    return new String(array); 
} 

public static char[] revEvenImpl(char[] array, int head, int tail) { 
     if (head == tail) 
     return array; 
     if (head % 2 == 0 && tail % 2 == 0) 
     { 
      swap(array, head, tail); 
     } 
     revEven(array, head+1, tail-1); 
    } 
+0

感謝您的信息。我的教授說,不要爲此使用數組。這就是我選擇使用子字符串和charAt方法的原因。 – coinbird

+0

@CoinBird如果你不能使用數組/索引,那麼你不能使用charAt(),它只是底層字符數組中索引的花哨名稱。 –

+0

對不起,我以爲你說過要將每個字符轉移到一個數組中。我們應該保持它作爲一個字符串。字符串的任何切換都要通過字符串連接完成。 charAt和substring方法是允許的。 – coinbird