2013-04-03 70 views
0

我的老師要求我們創建兩個方法來確定字符串是否是迴文。 一個必須是遞歸方法,另一個是迭代方法,我想出了迭代版本,但我不知道如何使它成爲遞歸方法。 歡迎任何幫助。謝謝作業 - 迭代遞歸方法

static boolean isPalindrome(String s) 
{ 
    String noSpaces = s.replaceAll("\\W", ""); //remove all non-word chars from string 
    String revString = ""; //store reversed string 

    //for loop working from outter chars to inner 
    //to reverse the string 

    for(int i = 1; i <= noSpaces.length(); i++) 
    { 
     //if true add char to revString String 
     if(noSpaces.charAt(i - 1) == noSpaces.charAt(noSpaces.length() - i)) 
      revString = revString + noSpaces.charAt(i - 1); 
    } 

    //return true if original string matches reversed string 
    if(noSpaces.equals(revString)) 
     return true; 
    else 
     return false; 

} 
+0

你可能要檢查你的全部大寫或小寫的字符串。 'noSpaces = noSpaces.toLowerCase();' – Justin 2013-04-03 22:53:21

回答

1

遞歸通過調用自身的方法工作。遞歸的一個着名例子是階乘:n! = n * (n-1)!。遞歸是有效的,因爲輸入每次都會改變;如果沒有,它基本上是一個無限循環,佔用內存並最終導致程序崩潰。關於遞歸的最後一件事:有一點,答案是已知的,例如階乘,0! = 1。遞歸方法需要爲這個已知值給出答案,否則它將繼續下去,直到它崩潰或拋出一個錯誤(因爲被問到一個不可能的事情)。在你的例子中,如果有一個字符或兩個完全相同的字符,你就知道是否是迴文。

遞歸:你想要的方法是取一個字符串,做replaceAll去除非字詞字符,(向它添加一個.toLowerCase()),然後檢查第一個和最後一個字符看看如果它們是相同的。如果是,則再次運行該方法,輸入爲noSpaces,刪除第一個和最後一個字符。但是,如果字符串的長度爲< = 3並且第一個和最後一個字符相同,則可以繼續並返回true。如果你不添加,你會嘗試刪除不存在的字符時出錯(還有另一種方法)。

你的迭代方法很大,你可以瘦身。你不需要檢查所有的字符,只有一半(如果你有奇數長度,然後1/2 + 1)。您也不需要製作字符串的副本,而是在同一個字符串上使用兩個charAt方法。

編輯:我沒有刪除我的代碼,因爲這是作業。如果你真的需要看看吧,看看編輯歷史

1

請接受一個字符串,返回類似的迭代方法的布爾遞歸方法。

  • 它會檢查第一個和最後一個字符,如果它們是不同的回報false

  • 如果它們是相同的呼叫,並取下作爲參數

    第一個和最後一個字符返回的方法
  • 如果是單個字符或空字符串,它將返回true

提示您迭代法:

  • 是否區分大小寫事?

  • 雖然你的方法是這樣做的一種方式,還有另一種方法,只需要檢查一半字符串(而不是從1noSpaces.length())。

1

試試這個:

public static boolean palindrome(String Str){ 
     if(Str.length()<=0) 
      return true; 
     if(Str.charAt(0)!=Str.charAt(Str.length()-1)) 
      return false; 
     else 
      return palindrome(Str.substring(1,Str.length()-1)); 
    }